StreamBuilder documentSnapshot问题

时间:2020-04-15 01:39:23

标签: flutter

streambuilder此处存在一些问题..它似乎工作得很好,并根据需要返回用户名,但调试控制台中始终显示错误。

═══════小部件库捕获到异常═══════════════════════════════════ 方法'[]'在null上被调用。 接收者:null 尝试致电: 相关的引起错误的小部件是 StreamBuilder

class UpdateForm extends StatefulWidget {
  @override
  _UpdateFormState createState() => _UpdateFormState();
}

class _UpdateFormState extends State<UpdateForm> {

  final _formKey = GlobalKey<FormState>();


  // form values
  String _currentName;


  @override
  Widget build(BuildContext context) {

    User user = Provider.of<User>(context);

return StreamBuilder<UserData>(
      stream: DatabaseService(uid: user.uid).userData,
      builder: (context, snapshot) {
        if(snapshot.hasData){
          UserData userData = snapshot.data;
          return Form(
            key: _formKey,
            child: Column(
              children: <Widget>[
                Text(
                  'Update your settings.',
                  style: TextStyle(fontSize: 18.0),
                ),
                SizedBox(height: 20.0),
                StreamBuilder<DocumentSnapshot>(
                      stream: Firestore.instance
                          .collection('users')
                          .document(user.uid)
                          .snapshots(),
                      builder: (BuildContext context,
                          AsyncSnapshot<DocumentSnapshot> snapshot) {
                        _currentName = snapshot.data['name'];
                        return Text(snapshot.data['name']);
                      }),

2 个答案:

答案 0 :(得分:1)

这只是我如何使用StreamBuilder的一个示例,请确保您同时在StreamBuilders上使用此设置。另外,您已经嵌套了StreamBuilder,但是AsyncSnapshots的命名方式相同,请给它们起不同的名称,例如snapshotasyncSnapshot

StreamBuilder<QuerySnapshot>(
          stream: Firestore.instance.collection('Test').snapshots(),
          builder: (BuildContext context,
              AsyncSnapshot<QuerySnapshot> asyncSnapshot) {
            if (asyncSnapshot.hasData) {
              List<DocumentChange> snapshot =
                  asyncSnapshot.data.documentChanges;
              snapshot.forEach((DocumentChange change) {
                _test.add(
                  Test(
                    name: change.document.data['name'],
                    value: change.document.data['value'],
                  ),
                );
              });
              return ListView.builder(
                  itemCount: _test.length,
                  itemBuilder: (BuildContext context, int index) {
                    return Row(
                      children: <Widget>[
                        Text(_test[index].name),
                        Text(_test[index].value.toString())
                      ],
                    );
                  });
            } else if (asyncSnapshot.hasError) {
              return Text('There was an error...');
            } else {
              return CircularProgressIndicator();
            }
          },
        ),

答案 1 :(得分:1)

问题出在第二个流生成器中。您不检查流中是否有数据。因此,您的流第一次是空的,这会导致错误,并且一旦数据从流中出来,StreamBuilder就会重新呈现自身,以隐藏第一次出现的错误。您正在检查第一个hasData的{​​{1}}。

简单地检查流中是否有数据,如果暂时没有返回加载器。

StreamBuilder