Flutter下拉列表含30-100项可选项且需联动过滤时如何存储?
方案选择结论
首先根据你的下拉选项的更新规则分两种场景判断:
场景1:下拉选项为固定静态值,仅版本迭代时才会修改
直接用const List是最优方案,理由如下:
- 30~100条的数据量极小,完全不会占用多余内存,加载速度远高于任何本地存储方案
- 不需要额外引入第三方依赖,也不需要写初始化、读写存储的冗余代码,上手成本更低,更适合新手
- 类型安全的常量列表排查问题更简单,不会出现本地存储读写异常的相关问题
场景2:下拉选项会动态更新,比如运行时从服务端拉取最新配置、允许用户自定义新增选项
这种场景下才需要用到本地存储,Hive是非常推荐的选择:它是轻量级的Key-Value存储,不需要写SQL语句,读写速度快,对于结构化列表的存储适配性很高。
具体实现参考
静态const List实现(推荐优先用)
不建议直接用裸Map存储,容易出现key拼写错误、类型不匹配的问题,先定义结构化的Dart模型:
class BrandOption { final int id; final String brandName; final List<String> itemNameList; const BrandOption({ required this.id, required this.brandName, required this.itemNameList, }); }
然后定义全局常量列表:
const List<BrandOption> brandOptionList = [ BrandOption(id: 0, brandName: "default 1", itemNameList: ["item1","item2","item3"]), BrandOption(id: 1, brandName: "default 2", itemNameList: ["item4","item5","item10"]), // 剩余的其他选项直接在此处追加即可 ];
联动过滤逻辑非常简单,只需要根据选中的品牌名过滤即可:
// 存储当前选中的品牌 String? selectedBrandName; // 联动得到的对应商品列表 List<String> get filteredItemList { if (selectedBrandName == null) return []; final matchedBrand = brandOptionList.firstWhere( (option) => option.brandName == selectedBrandName, orElse: () => const BrandOption(id: -1, brandName: '', itemNameList: []), ); return matchedBrand.itemNameList; }
当selectedBrandName变更时,filteredItemList会自动返回对应品牌下的选项,直接绑定到第二个下拉列表即可。
Hive存储实现(动态场景用)
- 按照Hive官方文档给
BrandOption类添加注解,生成对应的存储适配器 - 初始化Hive后注册适配器,打开对应存储盒子
- 全量存储/读取列表即可,不需要单条拆分存储:
// 存数据 await box.put('brand_option_list', brandOptionList); // 读数据 final brandOptionList = box.get('brand_option_list') as List<BrandOption>;
后续联动逻辑和静态方案完全一致。
内容的提问来源于stack exchange,提问作者Mj123213
相关产品推荐
相关产品推荐

