1. 批量修改所有直接调用AppTypography静态方法的地方,改为使用AppTypography.of(context)获取主题文本样式,适配不同主题上下文 2. 新增channelOrder存储键,支持频道排序持久化 3. 修复笔记删除全部功能未重置total字段的bug 4. 调整build.yaml配置,扩展freezed和json_serializable的生成范围 5. 优化底部弹窗默认样式,使用主题色替代硬编码颜色 6. 调整主题设置中的卡片样式默认文案
73 lines
2.6 KiB
Dart
73 lines
2.6 KiB
Dart
// ============================================================
|
||
// 闲言APP — 安全JSON转换器
|
||
// 创建时间: 2026-05-24
|
||
// 更新时间: 2026-05-24
|
||
// 作用: freezed模型使用的安全fromJson转换器,防止API返回类型不匹配崩溃
|
||
// 上次更新: 初始创建,提供int/String/double/List/Map/bool安全解析
|
||
// ============================================================
|
||
|
||
class SafeJson {
|
||
static int parseInt(dynamic value, [int defaultValue = 0]) {
|
||
if (value == null) return defaultValue;
|
||
if (value is int) return value;
|
||
if (value is double) return value.toInt();
|
||
if (value is String) return int.tryParse(value) ?? defaultValue;
|
||
return defaultValue;
|
||
}
|
||
|
||
static String parseString(dynamic value, [String defaultValue = '']) {
|
||
if (value == null) return defaultValue;
|
||
if (value is String) return value;
|
||
return value.toString();
|
||
}
|
||
|
||
static double parseDouble(dynamic value, [double defaultValue = 0.0]) {
|
||
if (value == null) return defaultValue;
|
||
if (value is double) return value;
|
||
if (value is int) return value.toDouble();
|
||
if (value is String) return double.tryParse(value) ?? defaultValue;
|
||
return defaultValue;
|
||
}
|
||
|
||
static bool parseBool(dynamic value, [bool defaultValue = false]) {
|
||
if (value == null) return defaultValue;
|
||
if (value is bool) return value;
|
||
if (value is int) return value != 0;
|
||
if (value is String) return value == '1' || value.toLowerCase() == 'true';
|
||
return defaultValue;
|
||
}
|
||
|
||
static List<T> parseList<T>(dynamic value, [List<T> defaultValue = const []]) {
|
||
if (value == null) return defaultValue;
|
||
if (value is List) return value.whereType<T>().toList();
|
||
return defaultValue;
|
||
}
|
||
|
||
static List<dynamic> parseDynamicList(dynamic value) {
|
||
if (value == null) return [];
|
||
if (value is List) return value;
|
||
return [];
|
||
}
|
||
|
||
static Map<String, dynamic> parseMap(dynamic value) {
|
||
if (value == null) return {};
|
||
if (value is Map<String, dynamic>) return value;
|
||
if (value is Map) return value.map((k, v) => MapEntry(k.toString(), v));
|
||
return {};
|
||
}
|
||
|
||
static Map<String, dynamic>? parseNullableMap(dynamic value) {
|
||
if (value is Map<String, dynamic>) return value;
|
||
if (value is Map) return value.map((k, v) => MapEntry(k.toString(), v));
|
||
return null;
|
||
}
|
||
|
||
static Map<String, dynamic> parseResponseData(Map<String, dynamic> response) {
|
||
final data = response['data'];
|
||
if (data == null) return response;
|
||
if (data is Map<String, dynamic>) return data;
|
||
if (data is Map) return data.map((k, v) => MapEntry(k.toString(), v));
|
||
return response;
|
||
}
|
||
}
|