import 'package:flutter/widgets.dart'; import 'package:flutter_svg/flutter_svg.dart'; class CategoryIconMeta { final String key; final String label; final String group; const CategoryIconMeta(this.key, this.label, this.group); } /// 全套自绘 SVG 图标(来自 design/ui-mockup.html v0.5) /// 使用方式:AppIcons.cat → SvgPicture.asset(AppIcons.cat, colorFilter: ..., width: 24) class AppIcons { AppIcons._(); static const _p = 'assets/icons/'; // AI 形象 static const cat = '${_p}i-cat.svg'; static const dog = '${_p}i-dog.svg'; static const robot = '${_p}i-robot.svg'; // 底部导航 static const home = '${_p}i-home.svg'; static const chart = '${_p}i-chart.svg'; static const chat = '${_p}i-chat.svg'; static const user = '${_p}i-user.svg'; static const plus = '${_p}i-plus.svg'; // 分类图标 static const food = '${_p}i-food.svg'; static const cup = '${_p}i-cup.svg'; static const cart = '${_p}i-cart.svg'; static const metro = '${_p}i-metro.svg'; static const house = '${_p}i-house.svg'; static const game = '${_p}i-game.svg'; static const pill = '${_p}i-pill.svg'; static const book = '${_p}i-book.svg'; static const shirt = '${_p}i-shirt.svg'; static const gift = '${_p}i-gift.svg'; static const plane = '${_p}i-plane.svg'; static const money = '${_p}i-money.svg'; static const tag = '${_p}i-tag.svg'; // 扩展 static const wallet = '${_p}i-wallet.svg'; static const target = '${_p}i-target.svg'; static const sparkle = '${_p}i-sparkle.svg'; static const briefcase = '${_p}i-briefcase.svg'; static const cardIcon = '${_p}i-card.svg'; static const search = '${_p}i-search.svg'; static const bell = '${_p}i-bell.svg'; static const eye = '${_p}i-eye.svg'; static const gear = '${_p}i-gear.svg'; static const mic = '${_p}i-mic.svg'; static const smile = '${_p}i-smile.svg'; static const camera = '${_p}i-camera.svg'; static const fire = '${_p}i-fire.svg'; static const chevronDown = '${_p}i-chev-d.svg'; static const chevronRight = '${_p}i-chev-r.svg'; static const close = '${_p}i-close.svg'; static const check = '${_p}i-check.svg'; static const exportIcon = '${_p}i-export.svg'; static const cloud = '${_p}i-cloud.svg'; static const swap = '${_p}i-swap.svg'; static const receipt = '${_p}i-receipt.svg'; static const edit = '${_p}i-edit.svg'; static const trash = '${_p}i-trash.svg'; static const drag = '${_p}i-drag.svg'; static const offline = '${_p}i-offline.svg'; static const wave = '${_p}i-wave.svg'; static const scan = '${_p}i-scan.svg'; // 扩展分类图标 static const car = '${_p}i-car.svg'; static const baby = '${_p}i-baby.svg'; static const pet = '${_p}i-pet.svg'; static const phone = '${_p}i-phone.svg'; static const wifi = '${_p}i-wifi.svg'; static const sport = '${_p}i-sport.svg'; static const beauty = '${_p}i-beauty.svg'; static const insurance = '${_p}i-shield.svg'; static const tax = '${_p}i-tax.svg'; static const rent = '${_p}i-rent.svg'; static const refund = '${_p}i-refund.svg'; static const interest = '${_p}i-interest.svg'; // 映射 iconKey → asset path static const keyMap = { 'food': food, 'cup': cup, 'cart': cart, 'metro': metro, 'house': house, 'game': game, 'pill': pill, 'book': book, 'shirt': shirt, 'gift': gift, 'plane': plane, 'tag': tag, 'money': money, 'briefcase': briefcase, 'chart': chart, 'card': cardIcon, 'sparkle': sparkle, 'wallet': wallet, 'cat': cat, 'dog': dog, 'robot': robot, 'target': target, 'camera': camera, 'receipt': receipt, 'car': car, 'baby': baby, 'pet': pet, 'phone': phone, 'wifi': wifi, 'sport': sport, 'beauty': beauty, 'insurance': insurance, 'tax': tax, 'rent': rent, 'refund': refund, 'interest': interest, }; static const categoryCatalog = [ CategoryIconMeta('food', '餐饮', '日常生活'), CategoryIconMeta('cup', '饮品', '日常生活'), CategoryIconMeta('cart', '购物', '日常生活'), CategoryIconMeta('house', '住房', '日常生活'), CategoryIconMeta('rent', '房租', '日常生活'), CategoryIconMeta('metro', '公交地铁', '交通出行'), CategoryIconMeta('car', '汽车', '交通出行'), CategoryIconMeta('plane', '旅行', '交通出行'), CategoryIconMeta('phone', '手机数码', '日常生活'), CategoryIconMeta('wifi', '网络通信', '日常生活'), CategoryIconMeta('shirt', '服饰', '日常生活'), CategoryIconMeta('beauty', '美容', '日常生活'), CategoryIconMeta('pill', '医疗', '健康成长'), CategoryIconMeta('sport', '运动', '健康成长'), CategoryIconMeta('book', '学习', '健康成长'), CategoryIconMeta('baby', '育儿', '健康成长'), CategoryIconMeta('pet', '宠物', '健康成长'), CategoryIconMeta('game', '娱乐', '休闲人情'), CategoryIconMeta('gift', '礼物人情', '休闲人情'), CategoryIconMeta('wallet', '钱包', '资金收入'), CategoryIconMeta('money', '工资', '资金收入'), CategoryIconMeta('briefcase', '工作兼职', '资金收入'), CategoryIconMeta('chart', '投资理财', '资金收入'), CategoryIconMeta('interest', '利息收益', '资金收入'), CategoryIconMeta('refund', '退款', '资金收入'), CategoryIconMeta('card', '银行卡', '资金收入'), CategoryIconMeta('insurance', '保险', '资金收入'), CategoryIconMeta('tax', '税费', '资金收入'), CategoryIconMeta('receipt', '票据账单', '其他'), CategoryIconMeta('camera', '摄影', '其他'), CategoryIconMeta('target', '目标', '其他'), CategoryIconMeta('sparkle', '奖励', '其他'), CategoryIconMeta('tag', '其他', '其他'), ]; static String avatarAsset(String key) => keyMap[key] ?? cat; /// 返回 SvgPicture widget static Widget icon(String asset, {double size = 24, Color? color}) { return SvgPicture.asset( asset, width: size, height: size, colorFilter: color != null ? ColorFilter.mode(color, BlendMode.srcIn) : null, ); } /// 按 iconKey 返回 SvgPicture static Widget byKey(String key, {double size = 24, Color? color}) { return icon(keyMap[key] ?? tag, size: size, color: color); } }