如何解决切换按钮在Flutter中不切换
我已经创建了一个带有ToggleButtons的GridList,但是当我尝试在彼此之间切换按钮时什么也没发生。有任何想法吗?我有一个列表isSelected,我在setState中将其称为。布局很好,但是一旦我使用GridView,它似乎就会更改setState。
class Backgrounds extends StatefulWidget {
@override
_BackgroundsState createState() => _BackgroundsState();
}
class _BackgroundsState extends State<Backgrounds> {
List<bool> isSelected;
void initState() {
isSelected = [true,false,false];
super.initState();
}
@override
Widget build(BuildContext context) {
var counter = 0;
return GridView.count(
padding: EdgeInsets.all(12),crossAxisCount: 3,mainAxisSpacing: 0,crossAxisSpacing: 0,children: [
Image.asset('images/image1.png'),Image.asset('images/image2.png'),Image.asset('images/image3.png'),Image.asset('images/image4.png'),Image.asset('images/image5.png'),Image.asset('images/image6.png'),Image.asset('images/image7.png'),Image.asset('images/image8.png')
].asMap().entries.map((widget) {
final index = ++counter - 1;
return ToggleButtons(
onPressed: (int index) {
print('selected');
setState(() {
// isSelected[index] = !isSelected[index];
for (int i = 1; i < isSelected.length; i++) {
isSelected[i] = i == index;
}
});
},isSelected: [isSelected[index]],// isSelected: (isSelected),selectedBorderColor: Color(0xff2244C7),borderColor: Colors.transparent,borderWidth: 3,borderRadius: BorderRadius.all(Radius.circular(8),),children: [widget.value],);
}).toList());
}
}
解决方法
问题出在切换按钮的“ onPressed()”函数上。由于“网格列表”视图是由地图生成的,因此每次“切换按钮”子级的子级列表大小为1时,“ OnPressed()”中的index参数将始终为0。我建议使用“ widget.key”在地图中,因为这样可以给出子窗口小部件的正确索引。因此,网格视图代码应为
return GridView.count(
padding: EdgeInsets.all(12),crossAxisCount: 3,mainAxisSpacing: 0,crossAxisSpacing: 0,children: [
Image.asset('images/image1.png'),Image.asset('images/image2.png'),Image.asset('images/image3.png'),Image.asset('images/image4.png'),Image.asset('images/image5.png'),Image.asset('images/image6.png'),Image.asset('images/image7.png'),Image.asset('images/image8.png')
].asMap().entries.map((widget) {
final index = ++counter - 1;
return ToggleButtons(
onPressed: (_) {
print('selected');
setState(() {
for (int i = 0; i < isSelected.length; i++) {
// isSelected[index] = !isSelected[index];
isSelected[i] = i == widget.key;
}
});
},isSelected: [isSelected[widget.key]],// isSelected: (isSelected),selectedBorderColor: Color(0xff2244C7),borderColor: Colors.transparent,borderWidth: 3,borderRadius: BorderRadius.all(Radius.circular(8),),children: [widget.value],);
}).toList());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。