58 lines
1.9 KiB
Dart
58 lines
1.9 KiB
Dart
/// 后端字段的防御式取值工具
|
|
///
|
|
/// 后端没有统一的响应包装,字段类型也可能与预期不符(例如金额返回字符串、
|
|
/// 数组返回 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<Map<String, dynamic>> asMapList(Object? value) {
|
|
if (value is! List) return const [];
|
|
return value.whereType<Map<String, dynamic>>().toList();
|
|
}
|
|
|
|
/// 取字符串数组(用于标签这类场景),非字符串元素丢弃,空串过滤掉
|
|
List<String> asStringList(Object? value) {
|
|
if (value is! List) return const [];
|
|
return value
|
|
.map((e) => e?.toString() ?? '')
|
|
.where((e) => e.isNotEmpty)
|
|
.toList();
|
|
}
|