- 清理大量废弃的 barrel 导出文件,移除冗余的中间导出层 - 修复所有相对路径导入错误,统一调整为扁平化模块引用 - 更新多平台 pubspec 版本号与依赖库版本 - 补充后端功能问题管理后台与脚本工具 - 调整部分页面的快捷方式文案适配新功能 - 更新部分翻译覆盖率与API文档
229 lines
5.8 KiB
Dart
229 lines
5.8 KiB
Dart
/// ============================================================
|
||
/// 闲言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中匹配iconData(IconData不可序列化)
|
||
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,
|
||
}
|