这是我第一次在这里发帖,所以如果我做错了,我会道歉。
我创建了一个带有布尔字段的自定义类来控制CheckBox状态/值:
class CustomModel {
static const TITLE_KEY = 'title';
String id;
String title;
bool isChecked = false;
void setIsChecked(bool isChecked) {
this.isChecked = isChecked;
}
bool getIsChecked() {
return isChecked;
}
CustomModel(Map<String, dynamic> ex) {
title = ex[TITLE_KEY];
}
}
在我的CheckBox小部件中:
return new ExpansionTile(
title: const Text('Title'),
backgroundColor: Colors.grey[100],
children: snapshot.data.documents
.map((DocumentSnapshot document) {
CustomModel ex = new CustomModel(document.data);
return new ListTile(
title: new Text(ex.title),
trailing: new Checkbox(
value: ex.getIsChecked(),
onChanged: (bool value) {
setState(() {
ex.setIsChecked(value);
});
}),
);
}).toList());
}),
单击时CheckBox不会发生变化(闪烁的种类)。日志显示CheckBox是&#34; false&#34;然后&#34; true&#34;,但如果我再次点击相同的CheckBox,日志显示&#34; false&#34;然后&#34; true&#34;,所以它似乎没有更新该字段。
我没有必要将值设置为&#34; isChecked&#34;当我在Java中这样做的时候,但如果我不这样做,Flutter会抛出一个错误。
I/flutter ( 6408): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I / flutter(6408):抛出以下断言构建StreamBuilder(脏,状态: I / flutter(6408):_ StreamBuilderBaseState&gt;#0512c): I / flutter(6408):&#39;包:flutter / src / material / checkbox.dart&#39;:失败的断言:第63行:&#39; tristate ||值!= I / flutter(6408):null&#39;:不是真的。
提前谢谢!
答案 0 :(得分:2)
我认为build()
位于StatefulWidget
类的setState()
方法中。因此,当您致电return new ExpansionTile(..);
时,它会重新构建小部件,这意味着再次调用CustomModel ex = new CustomModel(document.data);
。由于您的isChecked
也会再次实例化,因此此时CustomModel
将为false。因此,解决方案是将所有构建class MyWidget extends StatefulWidget {
State createState() => new MyWidgetState(); }
class MyWidgetState extends State<MyWidget> {
List<CustomModel> customModels = [];
@override
initState() {
//use listener to fetch data
Firestore.instance.collection("name").snapshots.listen((snapshot) {
for (var doc in snapshot.documents) {
CustomModel ex = new CustomModel(fieldname: doc['fieldname]);
customModels.add(ex);
}
}
}
@override
Widget build(BuildContext) {
return new ExpansionTile(
title: const Text('Title'),
backgroundColor: Colors.grey[100],
children: customModels.map((CustomModel ex) {
return new ListTile(
title: new Text(ex.title),
trailing: new Checkbox(
value: ex.getIsChecked(),
onChanged: (bool value) {
setState(() {
ex.setIsChecked(value);
});
}),
);
}).toList());
}),
}
}
列表放在initState()的firestore中。
这是一个想法,(可能会有一些语法错误,因为我直接写在这里)。
{{1}}