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 个。
解决方案:
- 硬编码:如果您确定屏幕上只有 6 个按钮,那么您可以对其进行硬编码。
- 使用 ListView Builder:如果 for 循环条件不是常量,那么最好在另一个 listview.builder(对于列)中使用 listview.builder(对于行)。
我给出的解决方案非常简短和抽象。如果您需要进一步解释,请发表评论。
最近的解决方案
GridView.count
、physics: const NeverScrollableScrollPhysics()
、shrinkWrap: true
、crossAxisCount: 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
在下面的代码中,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 个。
解决方案:
- 硬编码:如果您确定屏幕上只有 6 个按钮,那么您可以对其进行硬编码。
- 使用 ListView Builder:如果 for 循环条件不是常量,那么最好在另一个 listview.builder(对于列)中使用 listview.builder(对于行)。
我给出的解决方案非常简短和抽象。如果您需要进一步解释,请发表评论。
最近的解决方案
GridView.count
、physics: const NeverScrollableScrollPhysics()
、shrinkWrap: true
、crossAxisCount: 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