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

Flutter:如何将无JSON Model的搜索栏改造为基于JSON Model实现?

实现基于JSON Model的Flutter搜索栏改造思路

1. 定义JSON对应的Model类

先创建匹配JSON结构的数据模型,以原示例的列表场景为例,假设我们需要处理水果数据,定义Fruit类并实现JSON解析逻辑:

class Fruit {
  final String id;
  final String name;

  Fruit({required this.id, required this.name});

  // 从JSON对象解析为Model实例
  factory Fruit.fromJson(Map<String, dynamic> json) {
    return Fruit(
      id: json['id'],
      name: json['name'],
    );
  }

  // 可选:将Model转为JSON对象(用于数据存储/上传)
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
    };
  }
}

如果字段较多,推荐使用json_serializable插件自动生成解析代码,避免手动编写出错。

2. 替换数据源为Model列表

原示例使用List<String>存储数据,现在替换为List<Fruit>类型:

// 存储全量原始数据
List<Fruit> _allFruits = [];
// 存储搜索过滤后的展示数据
List<Fruit> _filteredFruits = [];

初始化时加载并解析JSON数据(可以是本地assets文件或网络请求返回的JSON):

Future<void> loadFruits() async {
  // 示例:从本地assets读取JSON文件
  String jsonString = await rootBundle.loadString('assets/fruits.json');
  List<dynamic> jsonList = json.decode(jsonString);
  _allFruits = jsonList.map((json) => Fruit.fromJson(json)).toList();
  _filteredFruits = List.from(_allFruits);
  setState(() {});
}

记得在initState生命周期方法中调用loadFruits()完成数据初始化。

3. 修改搜索过滤逻辑

原逻辑是过滤字符串,现在调整为判断Model的指定字段(比如水果名称)是否匹配搜索关键词:

void _filterFruits(String query) {
  List<Fruit> results = _allFruits.where((fruit) {
    return fruit.name.toLowerCase().contains(query.toLowerCase());
  }).toList();

  setState(() {
    _filteredFruits = results;
  });
}

4. 更新ListView的Item展示逻辑

原列表项仅展示字符串,现在改为渲染Model的属性:

ListView.builder(
  itemCount: _filteredFruits.length,
  itemBuilder: (context, index) {
    Fruit currentFruit = _filteredFruits[index];
    return ListTile(
      leading: Text(currentFruit.id),
      title: Text(currentFruit.name),
      // 可根据需求添加更多Model字段的展示内容
    );
  },
)

5. 保留搜索输入的交互逻辑

原示例中TextField的onChanged绑定逻辑无需修改,依然调用_filterFruits方法即可:

TextField(
  onChanged: (value) => _filterFruits(value),
  decoration: InputDecoration(
    labelText: '搜索水果',
    prefixIcon: Icon(Icons.search),
  ),
)

核心改造逻辑就是将数据载体从字符串替换为自定义Model,同步调整数据解析、过滤和UI渲染的对应逻辑即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:45:11