主要变更: 1. 全局修复类型转换问题,将多处`as int?`改为`(num?)?.toInt()`兼容浮点/字符串类型的数字字段 2. 移除废弃的nearby_p2p配对方式和对应的依赖包 3. 优化鸿蒙端快捷方式、引导页、路由导航的稳定性 4. 合并日志输出避免鸿蒙端IDE卡顿 5. 修复安卓端蓝牙权限冗余声明
145 lines
3.7 KiB
Dart
145 lines
3.7 KiB
Dart
/// ============================================================
|
||
/// 闲言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,
|
||
);
|
||
}
|