GestureDetector 中的 onTap 取值较少,但 Text 取值正确,两者都在同一个循环中使用

onTap in GestureDetector is taking a value less, but Text is taking correct, both used in the same loop

在下面的代码中,Text(subjects[address]) 打印了正确的值,但是 GestureDetector( onTap: 对整个 Row 取了相同的值,并递增 [=14= 的值] 和 address 分别直接通过 2 和 6,在退出内部循环时,

Column(
  children: [
    for (int i = 0, address = 0, subject = 0; i < 3; i++)
      Row(
        children: [
          for (int j = 0; j < 2; address += 3, subject++, j++)
            GestureDetector(
              child: Text(subjects[address]),
              onTap: () {.........},
            ),
        ],
      ),
  ],
),

代码打印: ,

所以当我点击 'Second' 时,onTap 应该执行 'Second' 的代码,即 subject('1' at Second),但它正在“2”代表第一和第二,“4”代表第三和第四,“6”代表第五和第六, subject 递增 2,address 递增 6,

谢谢你...

在呈现 UI 时,它采用“subject”变量的当前值,因此 UI 部分是正确的。

OnTap 无法正常工作,因为主题变量的值在 for 循环中的每次迭代后都会发生变化,因此当调用 ontap 时,它只采用“主题”变量的最后一个值,即 2,4,每行获得 6 个。

解决方案:

  1. 硬编码:如果您确定屏幕上只有 6 个按钮,那么您可以对其进行硬编码。
  2. 使用 ListView Builder:如果 for 循环条件不是常量,那么最好在另一个 listview.builder(对于列)中使用 listview.builder(对于行)。

我给出的解决方案非常简短和抽象。如果您需要进一步解释,请发表评论。

最近的解决方案

GridView.countphysics: const NeverScrollableScrollPhysics()shrinkWrap: truecrossAxisCount: 2

原因(代码失败背后)

官方 language-tour 中给出的外循环(在 Column( children: [..],), 内)显示了正确的(预期的)行为, 虽然内部循环 ( 在 Row( children: [..],), 内显示的行为是不正确和错误的,可能是一个错误,

官方报价

代码:

var callbacks = [];
for (var i = 0; i < 3; i++) {
  callbacks.add(() => print(i));
}
callbacks.forEach((c) => c());

正确(预期)输出:

0
1
2

不正确(错误)输出:

2
2
2