You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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存储实现(动态场景用)

  1. 按照Hive官方文档给BrandOption类添加注解,生成对应的存储适配器
  2. 初始化Hive后注册适配器,打开对应存储盒子
  3. 全量存储/读取列表即可,不需要单条拆分存储:
// 存数据
await box.put('brand_option_list', brandOptionList);
// 读数据
final brandOptionList = box.get('brand_option_list') as List<BrandOption>;

后续联动逻辑和静态方案完全一致。


内容的提问来源于stack exchange,提问作者Mj123213

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:45:01