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
相关产品推荐
相关产品推荐

