/// 后端字段的防御式取值工具 /// /// 后端没有统一的响应包装,字段类型也可能与预期不符(例如金额返回字符串、 /// 数组返回 null)。所有 fromJson 都走这里取值,保证解析绝不抛异常。 library; int asInt(Object? value, {int fallback = 0}) { if (value is int) return value; if (value is num) return value.toInt(); if (value is String) return int.tryParse(value) ?? fallback; return fallback; } /// 取可空整数:null / 无法解析都返回 null /// /// 用于 folderId 这类"没有值"本身有业务含义的字段 /// (null 表示未分类,不能退化成 0) int? asNullableInt(Object? value) { if (value == null) return null; if (value is int) return value; if (value is num) return value.toInt(); if (value is String) return int.tryParse(value); return null; } double asDouble(Object? value, {double fallback = 0}) { if (value is double) return value; if (value is num) return value.toDouble(); if (value is String) return double.tryParse(value) ?? fallback; return fallback; } String asString(Object? value, {String fallback = ''}) { if (value == null) return fallback; return value.toString(); } /// 取字符串,空串时回退(用于分类名/图标这类必须有值的展示字段) String asNonEmpty(Object? value, String fallback) { final text = asString(value); return text.isEmpty ? fallback : text; } /// 取对象数组,非 Map 的元素直接丢弃 List> asMapList(Object? value) { if (value is! List) return const []; return value.whereType>().toList(); } /// 取字符串数组(用于标签这类场景),非字符串元素丢弃,空串过滤掉 List asStringList(Object? value) { if (value is! List) return const []; return value .map((e) => e?.toString() ?? '') .where((e) => e.isNotEmpty) .toList(); }