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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 07:57:25