我有一个简化的flutter控件,类似于一排“单选”按钮或菜单栏。父组件传递一个包含每个按钮标题和回调函数的列表。该控件会触发回调函数并传递被点击按钮的索引。问题在于,这些“按钮”是动态创建的,数量可能由父组件决定。当我在GestureDetector的onTap函数中设置回调时,它总是使用循环中参数(idx)的最后一个值来触发回调。因此,如果有4个按钮,则doCallback始终使用4调用,无论点击哪个按钮。似乎doCallback被调用时是使用idx的引用,而不是idx的值。有没有办法让每个按钮将自己的索引发送到回调函数中?
class CtrlRadioSelector extends StatelessWidget {
CtrlRadioSelector({Key? key, required this.captions, required this.onTapItem})
: super(key: key);
final List<String> captions;
final ValueSetter<int> onTapItem;
@override
Widget build(BuildContext context) {
List<Widget> selectorItems = [];
int idx = 0;
for (var caption in captions) {
selectorItems.add(Expanded(
flex: 10,
child: GestureDetector(
onTap: () => doCallback(idx),
child: Text(caption,
textAlign: TextAlign.center,
style: TextStyle(fontSize: 18)))));
idx++;
}
return Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: selectorItems);
}
void doCallback(int idx) {
onTapItem(idx);
}
}