import 'package:get_storage/get_storage.dart'; /// 表情配置 class EmojiItem { final String id; final String name; final String path; const EmojiItem({ required this.id, required this.name, required this.path, }); Map toJson() => { 'id': id, 'name': name, 'path': path, }; factory EmojiItem.fromJson(Map json) => EmojiItem( id: json['id'], name: json['name'], path: json['path'], ); } class EmojiConfig { static const String basePath = 'assets/images/emoji/'; /// 所有表情列表(笑脸表情已排到前面) static const List allEmojis = [ // 笑脸表情放在最前面 EmojiItem(id: '19', name: '开心', path: '${basePath}emoji_19.png'), EmojiItem(id: '06', name: '吐舌笑', path: '${basePath}emoji_06.png'), EmojiItem(id: '11', name: '墨镜笑', path: '${basePath}emoji_11.png'), EmojiItem(id: '14', name: '奸笑', path: '${basePath}emoji_14.png'), EmojiItem(id: '17', name: '尴尬笑', path: '${basePath}emoji_17.png'), EmojiItem(id: '47', name: '猫咪笑', path: '${basePath}emoji_47.png'), EmojiItem(id: '54', name: '笑哭', path: '${basePath}emoji_54.png'), // 其他表情 EmojiItem(id: '01', name: '不爽', path: '${basePath}emoji_01.png'), EmojiItem(id: '02', name: '不自在', path: '${basePath}emoji_02.png'), EmojiItem(id: '03', name: '兴奋', path: '${basePath}emoji_03.png'), EmojiItem(id: '04', name: '叹气', path: '${basePath}emoji_04.png'), EmojiItem(id: '05', name: '吃惊', path: '${basePath}emoji_05.png'), EmojiItem(id: '07', name: '吐舌头', path: '${basePath}emoji_07.png'), EmojiItem(id: '08', name: '哭泣', path: '${basePath}emoji_08.png'), EmojiItem(id: '09', name: '困了', path: '${basePath}emoji_09.png'), EmojiItem(id: '10', name: '困惑', path: '${basePath}emoji_10.png'), EmojiItem(id: '12', name: '大哭', path: '${basePath}emoji_12.png'), EmojiItem(id: '13', name: '失望', path: '${basePath}emoji_13.png'), EmojiItem(id: '15', name: '害羞', path: '${basePath}emoji_15.png'), EmojiItem(id: '16', name: '尴尬', path: '${basePath}emoji_16.png'), EmojiItem(id: '18', name: '尴尬露齿', path: '${basePath}emoji_18.png'), EmojiItem(id: '20', name: '恶心', path: '${basePath}emoji_20.png'), EmojiItem(id: '21', name: '惊恐', path: '${basePath}emoji_21.png'), EmojiItem(id: '22', name: '惊讶', path: '${basePath}emoji_22.png'), EmojiItem(id: '23', name: '惊讶张嘴', path: '${basePath}emoji_23.png'), EmojiItem(id: '24', name: '惊讶感叹', path: '${basePath}emoji_24.png'), EmojiItem(id: '25', name: '愤怒咬牙', path: '${basePath}emoji_25.png'), EmojiItem(id: '26', name: '愤怒大叫', path: '${basePath}emoji_26.png'), EmojiItem(id: '27', name: '戴口罩', path: '${basePath}emoji_27.png'), EmojiItem(id: '28', name: '戴墨镜', path: '${basePath}emoji_28.png'), EmojiItem(id: '29', name: '抿嘴', path: '${basePath}emoji_29.png'), EmojiItem(id: '30', name: '担忧', path: '${basePath}emoji_30.png'), EmojiItem(id: '31', name: '斜眼不满', path: '${basePath}emoji_31.png'), EmojiItem(id: '32', name: '斜眼尴尬', path: '${basePath}emoji_32.png'), EmojiItem(id: '33', name: '斜眼无语', path: '${basePath}emoji_33.png'), EmojiItem(id: '34', name: '斜眼看', path: '${basePath}emoji_34.png'), EmojiItem(id: '35', name: '斜眼迟疑', path: '${basePath}emoji_35.png'), EmojiItem(id: '36', name: '无聊', path: '${basePath}emoji_36.png'), EmojiItem(id: '37', name: '无语', path: '${basePath}emoji_37.png'), EmojiItem(id: '38', name: '星星眼', path: '${basePath}emoji_38.png'), EmojiItem(id: '39', name: '晕倒', path: '${basePath}emoji_39.png'), EmojiItem(id: '40', name: '晕眩', path: '${basePath}emoji_40.png'), EmojiItem(id: '41', name: '流口水', path: '${basePath}emoji_41.png'), EmojiItem(id: '42', name: '流泪', path: '${basePath}emoji_42.png'), EmojiItem(id: '43', name: '流鼻涕', path: '${basePath}emoji_43.png'), EmojiItem(id: '44', name: '火冒三丈', path: '${basePath}emoji_44.png'), EmojiItem(id: '45', name: '焦虑', path: '${basePath}emoji_45.png'), EmojiItem(id: '46', name: '狡猾', path: '${basePath}emoji_46.png'), EmojiItem(id: '48', name: '生气', path: '${basePath}emoji_48.png'), EmojiItem(id: '49', name: '生气皱眉', path: '${basePath}emoji_49.png'), EmojiItem(id: '50', name: '疑问', path: '${basePath}emoji_50.png'), EmojiItem(id: '51', name: '眨眼害羞', path: '${basePath}emoji_51.png'), EmojiItem(id: '52', name: '眨眼飞吻', path: '${basePath}emoji_52.png'), EmojiItem(id: '53', name: '禁言', path: '${basePath}emoji_53.png'), EmojiItem(id: '55', name: '翻白眼', path: '${basePath}emoji_55.png'), EmojiItem(id: '56', name: '翻白眼叹气', path: '${basePath}emoji_56.png'), EmojiItem(id: '57', name: '翻白眼无奈', path: '${basePath}emoji_57.png'), EmojiItem(id: '58', name: '花痴', path: '${basePath}emoji_58.png'), EmojiItem(id: '59', name: '见钱眼开', path: '${basePath}emoji_59.png'), EmojiItem(id: '60', name: '闭嘴', path: '${basePath}emoji_60.png'), EmojiItem(id: '61', name: '震惊大叫', path: '${basePath}emoji_61.png'), EmojiItem(id: '62', name: '震惊无语', path: '${basePath}emoji_62.png'), EmojiItem(id: '63', name: '面无表情', path: '${basePath}emoji_63.png'), EmojiItem(id: '64', name: '飞吻', path: '${basePath}emoji_64.png'), ]; /// 根据ID获取表情 static EmojiItem? getEmojiById(String id) { try { return allEmojis.firstWhere((emoji) => emoji.id == id); } catch (e) { return null; } } /// 根据名称获取表情 static EmojiItem? getEmojiByName(String name) { try { return allEmojis.firstWhere((emoji) => emoji.name == name); } catch (e) { return null; } } /// 获取所有表情ID列表 static List get allEmojiIds => allEmojis.map((e) => e.id).toList(); /// 获取所有表情名称列表 static List get allEmojiNames => allEmojis.map((e) => e.name).toList(); // ==================== 最近使用管理 ==================== static const String _recentEmojisKey = 'recent_emojis'; static const int _maxRecentCount = 24; // 最多保存24个最近使用的表情 /// 获取最近使用的表情列表 static List getRecentEmojis() { final storage = GetStorage(); final List? recentList = storage.read(_recentEmojisKey); if (recentList == null || recentList.isEmpty) { return []; } return recentList .map((json) => EmojiItem.fromJson(Map.from(json))) .toList(); } /// 添加到最近使用(去重并置顶) static void addToRecentEmojis(EmojiItem emoji) { final storage = GetStorage(); List recentEmojis = getRecentEmojis(); // 移除已存在的相同表情 recentEmojis.removeWhere((item) => item.id == emoji.id); // 添加到列表开头 recentEmojis.insert(0, emoji); // 限制最大数量 if (recentEmojis.length > _maxRecentCount) { recentEmojis = recentEmojis.sublist(0, _maxRecentCount); } // 保存 storage.write(_recentEmojisKey, recentEmojis.map((e) => e.toJson()).toList()); } /// 清空最近使用 static void clearRecentEmojis() { final storage = GetStorage(); storage.remove(_recentEmojisKey); } /// 是否有最近使用的表情 static bool hasRecentEmojis() { return getRecentEmojis().isNotEmpty; } }