- 添加导航条目和分类数据模型 - 实现导航卡片网格展示 - 支持点击卡片打开链接 - 添加主题样式(渐变色、卡片阴影) - 区分系统默认和自定义条目 - 添加分类统计信息"
64 lines
1.5 KiB
Dart
64 lines
1.5 KiB
Dart
import '../../../../core/utils/text.dart';
|
|
|
|
/// 一张站点卡片,对应 `index.html` 里的 `.card`。
|
|
class LinkItem {
|
|
const LinkItem({
|
|
required this.id,
|
|
required this.title,
|
|
required this.url,
|
|
this.description = '',
|
|
});
|
|
|
|
/// 从 JSON 构造(将来接后端接口时使用)。
|
|
factory LinkItem.fromJson(Map<String, dynamic> json) {
|
|
return LinkItem(
|
|
id: json['id'] as String,
|
|
title: json['title'] as String,
|
|
url: json['url'] as String,
|
|
description: json['description'] as String? ?? '',
|
|
);
|
|
}
|
|
|
|
/// 唯一标识。
|
|
final String id;
|
|
|
|
/// 站点名称,同时用于生成卡片左上角的首字母图标。
|
|
final String title;
|
|
|
|
/// 跳转地址。
|
|
final String url;
|
|
|
|
/// 一句话描述。
|
|
final String description;
|
|
|
|
/// 卡片图标显示的首字符。
|
|
String get initial => firstChar(title).toUpperCase();
|
|
|
|
/// 展示用域名。
|
|
String get host => Uri.tryParse(url)?.host ?? url;
|
|
|
|
/// 序列化为 JSON。
|
|
Map<String, dynamic> toJson() => <String, dynamic>{
|
|
'id': id,
|
|
'title': title,
|
|
'url': url,
|
|
'description': description,
|
|
};
|
|
|
|
@override
|
|
bool operator ==(Object other) {
|
|
return identical(this, other) ||
|
|
other is LinkItem &&
|
|
other.id == id &&
|
|
other.title == title &&
|
|
other.url == url &&
|
|
other.description == description;
|
|
}
|
|
|
|
@override
|
|
int get hashCode => Object.hash(id, title, url, description);
|
|
|
|
@override
|
|
String toString() => 'LinkItem(id: $id, title: $title)';
|
|
}
|