Flutter 颤振,复选框状态不';不改变,如何改变?
我有一个Flutter 颤振,复选框状态不';不改变,如何改变?,flutter,setstate,Flutter,Setstate,我有一个ListViewbuilder,它创建了一些ListTitle,其中有一个复选框 当我在复选框的onChanged上设置state时,该值似乎没有改变 class ProjectPage extends StatefulWidget { final project; ProjectPage({Key key, this.project}) : super(key: key); @override _ProjectPageState createState() =>
ListView
builder,它创建了一些ListTitle
,其中有一个复选框
当我在复选框的onChanged
上设置state时,该值似乎没有改变
class ProjectPage extends StatefulWidget {
final project;
ProjectPage({Key key, this.project}) : super(key: key);
@override
_ProjectPageState createState() => new _ProjectPageState();
}
class _ProjectPageState extends State<ProjectPage> {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Container(
child: Column(
children: <Widget>[
new Expanded(
child: new ListView.builder(
itemBuilder: (BuildContext context, int index) => new ItemsItem(item: widget.project.items[index]),
itemCount: widget.project.items.length,
),
),
],
),
),
);
}
}
class ItemsItem extends StatefulWidget {
final item;
ItemsItem({Key key, this.item}) : super(key: key);
@override
_ItemsItemState createState() => new _ItemsItemState();
}
class _ItemsItemState extends State<ItemsItem> {
final GlobalKey<ScaffoldState> _mainState = new GlobalKey<ScaffoldState>();
@override
Widget build(BuildContext context) {
bool _isCompleted = widget.item.isCompleted;
return new ListTile(
key: _mainState,
title: new Row(
children: <Widget>[
new Expanded(child: new Text(widget.item.name)),
new Checkbox(
value: _isCompleted,
onChanged: (bool newValue) {
setState(() {
_isCompleted = newValue;
});
},
),
],
),
);
}
}
有什么想法吗
编辑:项目类
class Item {
final int id;
final String name;
final bool isCompleted;
Item({
this.id,
this.name,
this.isCompleted,
});
Item.fromJson(Map json)
: id = json['id'],
name = json['name'],
isCompleted = json['isCompleted'],
set isCompleted(bool value) {
isCompleted = value;
}
}
_isCompleted是构建方法内部的局部变量。当复选框的状态更改时,可以将局部变量设置为新值。setState导致再次调用build方法,该方法从widget.item.isCompleted获取旧的和未更改的值。您需要将widget.item.isCompleted设置为新的更改值:
setState(() {
widget.item.isCompleted = newValue;
});
顺便说一句,由于ItemsItem只是一个包含一行文本和一个复选框的ListTile,因此您更应该使用内置小部件\u isCompleted是构建方法中的一个局部变量。当复选框的状态更改时,可以将局部变量设置为新值。setState导致再次调用build方法,该方法从widget.item.isCompleted获取旧的和未更改的值。您需要将widget.item.isCompleted设置为新的更改值:
setState(() {
widget.item.isCompleted = newValue;
});
顺便说一句,因为您的ItemsItem只是一个包含一行文本和一个复选框的ListTile,您更应该使用内置小部件,因为它不起作用。。在
项
类中,我有一个setterset isCompleted(bool value){isCompleted=value;}
但是我得到了这个堆栈溢出:在处理一个手势时抛出了下面的StackOverflower错误:
error我为添加了项
类reference@Patrioticcow问题是,在您的Item类中,isCompleted是final,但您试图使用isCompleted setter进行设置。将不起作用。。在项
类中,我有一个setterset isCompleted(bool value){isCompleted=value;}
但是我得到了这个堆栈溢出:在处理一个手势时抛出了下面的StackOverflower错误:
error我为添加了项
类reference@Patrioticcow问题是,在Item类中,isCompleted是final,但您试图使用isCompleted setter进行设置。