使用自定义类属性更改CheckBox值

时间:2018-03-11 02:39:59

标签: android mobile dart flutter

这是我第一次在这里发帖,所以如果我做错了,我会道歉。

我创建了一个带有布尔字段的自定义类来控制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;:不是真的。

提前谢谢!

1 个答案:

答案 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}}