首页 > 解决方案 > 在flutter firebase中调用了方法'[]'的空错误

问题描述

我正在使用firebase firestore制作个人资料页面,但没有收到此类方法错误,方法'[]'在null上调用并尝试调用:。下面是我命名为“Kisi”的用户类

 class Kisi {
  final String username,uid,email,photoUrl,name,surname;
  Kisi({this.username,this.uid,this.email,this.name,this.photoUrl,this.surname});

  factory Kisi.fromDocument(DocumentSnapshot doc)
  {
    return Kisi(
      uid:  doc.data()['uid'],
      username:  doc.data()['username'],
      name:  doc.data()['name'],
      photoUrl:  doc.data()['photoURL'],
      surname:  doc.data()['surname']
    );
  }
}

我在调用 FirebaseFirestore 的构建方法中的以下类中遇到错误。

在构建 StreamBuilder(dirty, state: _StreamBuilderBaseState<DocumentSnapshot, AsyncSnapshot>#6be47) 时引发了以下 NoSuchMethodError:在 null 上调用了方法“[]”。接收者:null 尝试调用:

class MyAccount extends StatefulWidget {
  @override
  _MyAccountState createState() => _MyAccountState();
}

class _MyAccountState extends State<MyAccount> {
  FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  User currentUser;

  @override
  void initState() {
    super.initState();
    _loadCurrentUser();
  }

  void _loadCurrentUser() {
    firebaseAuth.authStateChanges().listen((User user) {
      setState(() {
        this.currentUser = user;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: FirebaseFirestore.instance
          .collection('Users')
          .doc(currentUser.uid.toString())
          .snapshots(),
      builder: (context, snapshot) {
        Kisi user = Kisi.fromDocument(snapshot.data);
        return Scaffold(
          appBar: AppBar(
            elevation: 0,
          ),
          body: Padding(
            padding: const EdgeInsets.all(15.0),
            child: ListView(
              children: <Widget>[
                Container(
                  child: Text(
                    "Giriş ve Güvenlik",
                    style:
                        TextStyle(fontSize: 28.0, fontWeight: FontWeight.bold),
                  ),
                ),
                Card(
                  child: Column(
                    children: <Widget>[
                      Container(                      
                        child: Text(
                          "İsim:",
                          style: TextStyle(fontWeight: FontWeight.bold),), ),
                      Container(                     
                        child: Text(
                          user.name),
                      ),                
                    ],
                  ),
                ),
              ],
            ),
          ),
        );
      },
    );
  }
}

标签: firebasefluttergoogle-cloud-firestore

解决方案


StreamBuilder是异步的,因此获取数据需要时间。您需要执行以下操作:

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: FirebaseFirestore.instance
          .collection('Users')
          .doc(currentUser.uid.toString())
          .snapshots(),
      builder: (context, snapshot) {
      if(snapshot.hasData){
        Kisi user = Kisi.fromDocument(snapshot.data);
        return Scaffold(
          appBar: AppBar(
            elevation: 0,
          ),
          body: Padding(
            padding: const EdgeInsets.all(15.0),
            child: ListView(
              children: <Widget>[
                Container(
                  child: Text(
                    "Giriş ve Güvenlik",
                    style:
                        TextStyle(fontSize: 28.0, fontWeight: FontWeight.bold),
                  ),
                ),
                Card(
                  child: Column(
                    children: <Widget>[
                      Container(                      
                        child: Text(
                          "İsim:",
                          style: TextStyle(fontWeight: FontWeight.bold),), ),
                      Container(                     
                        child: Text(
                          user.name),
                      ),                
                    ],
                  ),
                ),
              ],
            ),
          ),
        );
       },
      else {
        return CircularProgressIndicator();
      }
      },
    );
  }

添加一个条件,circularprogressindicator当数据仍未获取时将显示一个。


推荐阅读