Files
xianyan/lib/features/share/share_target.dart
Developer f91be94e9c refactor: 完成项目架构重构,统一模块导入路径
- 清理大量废弃的 barrel 导出文件,移除冗余的中间导出层
- 修复所有相对路径导入错误,统一调整为扁平化模块引用
- 更新多平台 pubspec 版本号与依赖库版本
- 补充后端功能问题管理后台与脚本工具
- 调整部分页面的快捷方式文案适配新功能
- 更新部分翻译覆盖率与API文档
2026-06-12 08:53:57 +08:00

229 lines
5.8 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-30
/// 更新时间: 2026-06-12
/// 作用: 可编辑的分享目标枚举,支持增删排序和持久化
/// 上次更新: 添加iconData字段支持CupertinoIcons图标
/// ============================================================
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../../../core/utils/logger.dart';
class ShareTarget {
const ShareTarget({
required this.id,
required this.label,
required this.emoji,
required this.type,
this.iconData,
this.enabled = true,
this.sortOrder = 0,
});
final String id;
final String label;
final String emoji;
final IconData? iconData;
final ShareTargetType type;
final bool enabled;
final int sortOrder;
static const _prefsKey = 'share_targets_v1';
static List<ShareTarget> get defaults => const [
ShareTarget(
id: 'copy_text',
label: '复制文字',
emoji: '📋',
iconData: CupertinoIcons.doc_on_clipboard,
type: ShareTargetType.copyText,
),
ShareTarget(
id: 'copy_url',
label: '复制链接',
emoji: '🔗',
iconData: CupertinoIcons.link,
type: ShareTargetType.copyUrl,
sortOrder: 1,
),
ShareTarget(
id: 'system_share',
label: '系统分享',
emoji: '📤',
iconData: CupertinoIcons.share,
type: ShareTargetType.systemShare,
sortOrder: 2,
),
ShareTarget(
id: 'save_qr',
label: '保存二维码',
emoji: '💾',
iconData: CupertinoIcons.qrcode,
type: ShareTargetType.saveQrCode,
sortOrder: 3,
),
ShareTarget(
id: 'save_card',
label: '保存卡片',
emoji: '🎴',
iconData: CupertinoIcons.photo,
type: ShareTargetType.saveCardImage,
sortOrder: 4,
),
ShareTarget(
id: 'save_gallery',
label: '保存到相册',
emoji: '🖼️',
iconData: CupertinoIcons.photo_on_rectangle,
type: ShareTargetType.saveToGallery,
sortOrder: 5,
),
ShareTarget(
id: 'wechat_friend',
label: '微信好友',
emoji: '💚',
iconData: CupertinoIcons.chat_bubble_2,
type: ShareTargetType.wechatFriend,
enabled: false,
sortOrder: 6,
),
ShareTarget(
id: 'wechat_moments',
label: '朋友圈',
emoji: '🟢',
iconData: CupertinoIcons.chat_bubble_2_fill,
type: ShareTargetType.wechatMoments,
enabled: false,
sortOrder: 7,
),
ShareTarget(
id: 'qq',
label: 'QQ',
emoji: '🐧',
iconData: CupertinoIcons.chat_bubble_2,
type: ShareTargetType.qq,
enabled: false,
sortOrder: 8,
),
ShareTarget(
id: 'weibo',
label: '微博',
emoji: '🔴',
iconData: CupertinoIcons.chat_bubble_2,
type: ShareTargetType.weibo,
enabled: false,
sortOrder: 9,
),
ShareTarget(
id: 'add_note',
label: '添加笔记',
emoji: '📝',
iconData: CupertinoIcons.doc_text,
type: ShareTargetType.addNote,
sortOrder: 10,
),
];
Map<String, dynamic> toJson() => {
'id': id,
'label': label,
'emoji': emoji,
'type': type.name,
'enabled': enabled,
'sortOrder': sortOrder,
};
factory ShareTarget.fromJson(Map<String, dynamic> json) {
return ShareTarget(
id: json['id'] as String,
label: json['label'] as String,
emoji: json['emoji'] as String,
// iconData不序列化通过load()从defaults恢复
type: ShareTargetType.values.firstWhere(
(t) => t.name == json['type'],
orElse: () => ShareTargetType.systemShare,
),
enabled: json['enabled'] as bool? ?? true,
sortOrder: json['sortOrder'] as int? ?? 0,
);
}
ShareTarget copyWith({
String? id,
String? label,
String? emoji,
IconData? iconData,
ShareTargetType? type,
bool? enabled,
int? sortOrder,
}) {
return ShareTarget(
id: id ?? this.id,
label: label ?? this.label,
emoji: emoji ?? this.emoji,
iconData: iconData ?? this.iconData,
type: type ?? this.type,
enabled: enabled ?? this.enabled,
sortOrder: sortOrder ?? this.sortOrder,
);
}
static Future<List<ShareTarget>> load() async {
try {
final prefs = await SharedPreferences.getInstance();
final raw = prefs.getString(_prefsKey);
if (raw == null) return defaults;
final list = jsonDecode(raw) as List;
return list
.map((e) {
final target = ShareTarget.fromJson(e as Map<String, dynamic>);
// 从defaults中匹配iconDataIconData不可序列化
final defaultTarget =
defaults.where((d) => d.id == target.id).firstOrNull;
return target.copyWith(iconData: defaultTarget?.iconData);
})
.toList()
..sort((a, b) => a.sortOrder.compareTo(b.sortOrder));
} catch (e) {
Log.e('加载分享目标失败', e);
return defaults;
}
}
static Future<void> save(List<ShareTarget> targets) async {
try {
final prefs = await SharedPreferences.getInstance();
final json = jsonEncode(targets.map((t) => t.toJson()).toList());
await prefs.setString(_prefsKey, json);
} catch (e) {
Log.e('保存分享目标失败', e);
}
}
static Future<void> reset() async {
try {
final prefs = await SharedPreferences.getInstance();
await prefs.remove(_prefsKey);
} catch (e) {
Log.e('重置分享目标失败', e);
}
}
}
enum ShareTargetType {
copyText,
copyUrl,
systemShare,
saveQrCode,
saveCardImage,
saveToGallery,
wechatFriend,
wechatMoments,
qq,
weibo,
addNote,
}