从Firebase处理实时数据库时CheckboxListTile无法正常工作

时间:2018-12-24 10:54:07

标签: dart flutter

我正在尝试使用StreamBuilder从联机服务器Firebase创建数据列表,但不会选中此复选框。

我已经使用StreamBuilder来获取数据,并使用LisTile小部件来构建列表项,但是在定义setState()函数后,checkboxtilelist小部件将无法工作。并且buildBody是在build Widget类下定义的。

Widget buildBody(BuildContext context) {
  return StreamBuilder<QuerySnapshot>(
    stream: Firestore.instance.collection('hisab').snapshots(),
    builder: (context, snapshots) {
      if (!snapshots.hasData) {
        return LinearProgressIndicator();
      }
      return _buildList(context, snapshots.data.documents);
    }
  );
}

Widget _buildList(BuildContext context, List<DocumentSnapshot> snapshot) {
  return ListView(
    padding: EdgeInsets.only(top: 20.0),
    children: snapshot.map((data) => _buildListitem(context, data)).toList(),
  );
}

Widget _buildListitem(BuildContext context, DocumentSnapshot data) {
  final record = Record.fromSnapshot((data));
  bool _values = false;
  void _onChanged(bool newValue) {
    setState(() {
      _values = newValue;
    });
  }

  return Padding(
    padding: EdgeInsets.symmetric(horizontal: 18.0, vertical: 9.0),
    child: Container(
      decoration: BoxDecoration(
        border: Border.all(color: Colors.white),
        borderRadius: BorderRadius.circular(5.0),
      ),
      child: new ListTile(
        onTap: () {
          _onChanged(!_values);
        },
        leading: CircleAvatar(child: Text(record.name[0])),
        title: new Column(
          children: <Widget>[
            new CheckboxListTile(
              title: Text(record.name),
              value: _values,
              onChanged: _onChanged,
            )
          ],
        ),
      ),
    ),
  );
}

1 个答案:

答案 0 :(得分:0)

如果您创建新的有状态小部件类,则是一个好主意:

class CustomListItemWidget extends StatefulWidget {
  CustomListItemWidget({Key key, @required this.record}) : super(key: key);

  final record;

  @override
  State createState() => _CustomListItemWidgetState();
}

class _CustomListItemWidgetState extends State<CustomListItemWidget> {

  bool _values = false;
  void _onChanged(bool newValue) {
    setState(() {
      _values = newValue;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 18.0, vertical: 9.0),
      child: Container(
        decoration: BoxDecoration(
          border: Border.all(color: Colors.white),
          borderRadius: BorderRadius.circular(5.0),
        ),
        child: new ListTile(
          onTap: () {
            _onChanged(!_values);
          },
          leading: CircleAvatar(child: Text(widget.record.name[0])),
          title: new Column(
            children: <Widget>[
              new CheckboxListTile(
                title: Text(widget.record.name[0]),
                value: _values,
                onChanged: _onChanged,
              )
            ],
          ),
        ),
      ),
    );
  }
}

接下来,您可以通过_buildListitem方法传递值:

Widget _buildListitem(BuildContext context, DocumentSnapshot data) {
  return CustomListItemWidget(
    record: Record.fromSnapshot((data)),
  );
}