Flutter中json.decode后indexOf始终返回0,为何与普通列表表现不同?
问题解答
1. 为什么json解码后的列表indexOf始终返回0?
你这段代码的核心问题是每次循环都重复调用json.decode(item.details?["result"])。
json.decode每次执行都会生成一个全新的列表实例:
- 你遍历的
item2来自第一次解码出来的列表A - 调用
indexOf(item2)时,用的是第二次解码出来的列表B
哪怕A和B的内容看起来完全一样,里面的元素如果是Map这类引用类型,就是完全不同的对象;就算是字符串、数字这类值类型,B里的元素也是新创建的副本。所以在B里找A的item2根本找不到,indexOf返回-1,加1之后就变成了0——这就是所有结果都是0的原因。
而普通列表的代码里,values是同一个列表实例,遍历的item本身就属于这个列表,所以indexOf能正确定位到索引。
2. 能不能在for循环内声明新变量?
当然可以,而且这刚好能解决你第一个问题——把解码后的列表提前存成变量,既避免重复解码浪费性能,又能保证用同一个列表实例获取索引:
推荐写法(适合新版Dart)
Widget build(BuildContext context) { return Scaffold( body: Container( ... for (var item in values) Column( children: [ Text((values.indexOf(item) + 1).toString()), // 先解码当前item的结果列表,存成变量再遍历 if (item.details?["result"] != null) let resultList = json.decode(item.details!["result"]); for (var item2 in resultList) Text((resultList.indexOf(item2) + 1).toString()), ], ), ), ); }
更稳妥的带索引遍历(适合有重复元素的场景)
如果resultList里可能存在重复元素,indexOf只会返回第一个匹配项的索引,这时用带索引的遍历更准确:
Widget build(BuildContext context) { return Scaffold( body: Container( ... for (var item in values) Column( children: [ Text((values.indexOf(item) + 1).toString()), if (item.details?["result"] != null) let resultList = json.decode(item.details!["result"]); for (var i = 0; i < resultList.length; i++) Text((i + 1).toString()), ], ), ), ); }
内容的提问来源于stack exchange,提问作者user3132858
相关产品推荐
相关产品推荐

