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

Flutter中如何将setState里JSON的固定索引替换为传入的动态ID?

解决Flutter Bus组件动态加载城市线路数据的问题

核心修复:直接通过widget.id访问父组件参数

你不需要手动把id传入_BusState的构造函数,State类自带的widget属性可以直接访问对应StatefulWidget(也就是Bus类)的所有公开属性。修改代码如下:

class Bus extends StatefulWidget {
  final String city;
  final int id;
  // 推荐用命名参数+required提升代码可读性
  const Bus({super.key, required this.city, required this.id});

  @override
  State<Bus> createState() => _BusState();
}

class _BusState extends State<Bus> {
  List _bus = [];

  @override
  void initState() {
    super.initState();
    // 组件初始化时触发数据加载
    readJsonFile();
  }

  Future<void> readJsonFile() async {
    final String res = await rootBundle.loadString('assets/bus.json');
    final busData = json.decode(res);

    setState(() {
      // 用widget.id替换固定索引1
      _bus = busData['data'][widget.id]['directions'];
    });
  }

  // 补充build方法(根据你的布局需求实现)
  @override
  Widget build(BuildContext context) {
    return // 你的组件布局代码;
  }
}

更健壮的优化:根据城市名称匹配数据(推荐)

依赖索引的方式风险较高,若JSON中城市顺序发生变化,会直接导致加载错误数据。建议直接根据widget.city匹配对应城市的数据:

Future<void> readJsonFile() async {
  final String res = await rootBundle.loadString('assets/bus.json');
  final busData = json.decode(res);

  // 遍历数据数组,找到城市名称匹配的项
  final cityData = (busData['data'] as List).firstWhere(
    (item) => item['city'] == widget.city,
    // 找不到匹配项时返回空线路数据,避免报错
    orElse: () => {'directions': []},
  );

  setState(() {
    _bus = cityData['directions'];
  });
}

这种方式无需依赖索引,无论JSON中城市顺序如何调整,都能准确加载对应城市的线路数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:30:47