我正在尝试动态构建小部件列表
List<Widget> buildGrid(){ List<Widget> grid = new List<Widget>(3); List<Widget> tiles = []; int counter = 0; for (int i = 0; i < 3; i++){ tiles = []; for (int j = 0; j < 4; j++){ tiles.add(new GestureDetector( onTap: (){ setState((){ toggleColor(counter); }); }, child: new Container( color: colors[counter], width: 80.0, height: 80.0, margin: new EdgeInsets.all(11.3), ) )); counter++; } grid[i] = new Row( children: tiles, ); counter = 0; } return grid; }
这样做的问题是,新添加的元素的toggleColor始终为12。我的意思是说,它会使用计数器的当前迭代添加一个新的GestureDetector,这样,如果用户单击某个元素,则只会为其着色。例如,如果我将counter设置为3,那么所有内容都会被选中,因为如果您知道我的意思,那么它仍然引用counter变量,而不是当前交互。
关于如何有效解决此问题的任何建议?
您需要将计数器变量的当前值捕获到一个闭包中:
final _createTapHandler = (value) { setState(() => toggleColor(value)); };
然后您可以说:
onTap: _createTapHandler(counter)
也许更可维护的解决方案是创建一种构建GestureRecognizer的方法。然后,您可以使用计数器值对其进行配置。
Widget buildTile(int tileCounter) { return new GestureDetector( onTap: (){ setState((){ toggleColor(tileCounter); }); }, child: new Container( color: colors[tileCounter], width: 80.0, height: 80.0, margin: new EdgeInsets.all(11.3), ) ); }
如果您想要更加可维护,则可以将该构建函数重构为它自己的StatelessWidget。