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 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 toJson() => { '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)'; }