Files
xianyan/lib/features/discover/models/hanzi_result.dart
Developer ae6804e8bd refactor: 兼容后端返回数字类型波动,清理废弃代码
主要变更:
1.  全局修复类型转换问题,将多处`as int?`改为`(num?)?.toInt()`兼容浮点/字符串类型的数字字段
2.  移除废弃的nearby_p2p配对方式和对应的依赖包
3.  优化鸿蒙端快捷方式、引导页、路由导航的稳定性
4.  合并日志输出避免鸿蒙端IDE卡顿
5.  修复安卓端蓝牙权限冗余声明
2026-06-07 08:04:38 +08:00

145 lines
3.7 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/// ============================================================
/// 闲言APP — 汉语工具查询结果模型
/// 创建时间: 2026-04-28
/// 更新时间: 2026-04-28
/// 作用: 汉语工具各类查询结果的统一数据模型
/// 上次更新: 初始创建覆盖17种汉语工具类型
/// ============================================================
class HanziResult {
const HanziResult({
required this.type,
required this.query,
required this.data,
this.total = 0,
this.page = 1,
});
final String type;
final String query;
final dynamic data;
final int total;
final int page;
bool get isEmpty => _extractList().isEmpty && data is! Map;
bool get isList => data is List;
bool get isMap => data is Map;
bool get isString => data is String;
List<Map<String, dynamic>> get items {
final raw = data;
if (raw is List) {
return raw
.whereType<Map<String, dynamic>>()
.toList();
}
if (raw is Map<String, dynamic>) {
final list = raw['data'] ?? raw['list'];
if (list is List) {
return list.whereType<Map<String, dynamic>>().toList();
}
return [raw];
}
return [];
}
List<Map<String, dynamic>> _extractList() {
final raw = data;
if (raw is List) {
return raw.whereType<Map<String, dynamic>>().toList();
}
if (raw is Map<String, dynamic>) {
final list = raw['data'] ?? raw['list'];
if (list is List) {
return list.whereType<Map<String, dynamic>>().toList();
}
}
return [];
}
Map<String, dynamic> toCacheJson() => {
'type': type,
'query': query,
'data': data,
'total': total,
'page': page,
};
factory HanziResult.fromCacheJson(Map<String, dynamic> json) => HanziResult(
type: json['type'] as String? ?? '',
query: json['query'] as String? ?? '',
data: json['data'],
total: (json['total'] as num?)?.toInt() ?? 0,
page: (json['page'] as num?)?.toInt() ?? 1,
);
}
class HanziQueryRecord {
const HanziQueryRecord({
required this.type,
required this.query,
required this.timestamp,
this.resultCount = 0,
});
final String type;
final String query;
final DateTime timestamp;
final int resultCount;
String get displayType {
const map = {
'zi': '汉字',
'zuci': '组词',
'cidian': '词典',
'chengyu': '成语',
'jinyici': '近义词',
'fanyici': '反义词',
'juzi': '造句',
'poetry': '古诗词',
'nick': '网名',
'brainteaser': '脑筋急转弯',
'couplet': '对联',
'riddle': '谜语',
'wisdom': '名言',
'saying': '谚语',
'lyric': '歌词',
'story': '故事',
'zuowen': '作文',
'why': '为什么',
'drug': '药品',
'food': '食物相克',
'herbal': '中药材',
'pianfang': '偏方',
'tisana': '药茶',
'changshi': '常识',
'xiehouyu': '歇后语',
'illness': '疾病',
'composition': '作文',
'airport': '机场',
'port': '港口',
'site': '网站',
'cs': '常识',
'func': '人体',
};
return map[type] ?? type;
}
Map<String, dynamic> toJson() => {
'type': type,
'query': query,
'timestamp': timestamp.millisecondsSinceEpoch,
'resultCount': resultCount,
};
factory HanziQueryRecord.fromJson(Map<String, dynamic> json) =>
HanziQueryRecord(
type: json['type'] as String? ?? '',
query: json['query'] as String? ?? '',
timestamp: DateTime.fromMillisecondsSinceEpoch(
(json['timestamp'] as num?)?.toInt() ?? 0,
),
resultCount: (json['resultCount'] as num?)?.toInt() ?? 0,
);
}