Flutter - 动态构建小部件
Flutter - Build Widgets dynamically
我正在尝试动态构建小部件列表
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 和当前迭代的计数器,这样如果用户点击一个元素,它只会给它上色。例如,如果我将计数器设置为 3,所有内容都会被选中,因为它仍然引用计数器变量,而不是当前的交互,如果你明白我的意思的话。
关于如何有效解决这个问题有什么建议吗?
您需要将计数器变量的当前值捕获到闭包中:
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 中。
我正在尝试动态构建小部件列表
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 和当前迭代的计数器,这样如果用户点击一个元素,它只会给它上色。例如,如果我将计数器设置为 3,所有内容都会被选中,因为它仍然引用计数器变量,而不是当前的交互,如果你明白我的意思的话。
关于如何有效解决这个问题有什么建议吗?
您需要将计数器变量的当前值捕获到闭包中:
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 中。