【问题标题】:Getter uid being called on null in flutter fireGetter uid 在 Flutter Fire 中被调用为 null
【发布时间】:2020-05-11 15:19:15
【问题描述】:

我正在尝试连接两个 UID 以创建聊天室。一个 uid 是从 firebase 读取的,而另一个是从 FirebaseAuth.instance 读取的。

正在按应有的方式分配 clientUID,因为我将它传递到 Text 小部件上的另一个页面。然而,聊天室并没有在 firestore 树中创建,所以我认为这应该是因为讲师 uid。

也许我没有按应有的方式调用 FirebaseAuth.instance?

代码:

class ClientiPage extends StatefulWidget {
  static const String id = 'CLIENTI';

  @override
  _ClientiPageState createState() => _ClientiPageState();
}

class _ClientiPageState extends State<ClientiPage> {

  String chatRoomID;
  String clientUID;

  Firestore db = Firestore.instance;

  String instructor;

  void getInstructorId() async {
    instructor = (await FirebaseAuth.instance.currentUser()).uid;
  }

  void saveChatRoom() {

    getInstructorId();

    DocumentReference chatroomIdRef = db.collection('instructori').document(instructor).collection("chatrooms").document(chatRoomID);

    if (chatroomIdRef == null) {
      db.collection('instructori').document(instructor).collection("chatrooms").document(chatRoomID);
    }  
  }

  void createChatRoom() {
    getInstructorId();
    chatRoomID = clientUID + instructor;

    if(chatRoomID != null) {
      saveChatRoom();

      Navigator.push(
        context, 
        MaterialPageRoute(
          builder: (context) => ChatPage(
            chatRoomID: chatRoomID,
            clientUID: clientUID,
          ),
        ),
      );
    }
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
        stream: db.collection('clienti').snapshots(),
        builder: (context, snapshot) {
          if (snapshot.data == null) {
            return Center(
              child: CircularProgressIndicator(),
            );
          } else {
            return ListView.builder(      
              itemCount: snapshot.data.documents.length,
              itemBuilder: (context, index) {
                clientUID = snapshot.data.documents[index]["UID"];
                return Column(
                  children: <Widget>[
                    Divider(
                      height: 10.0,
                    ),
                    new ListTile(
                      onTap: createChatRoom,
                      title: new Row(
                        mainAxisAlignment: MainAxisAlignment.spaceBetween,
                        children: <Widget>[
                          new Text(
                            snapshot.data.documents[index]["numar_telefon"],
                            style: new TextStyle(
                              fontWeight: FontWeight.bold,
                            ),
                          ),
                        ],
                      ),
                    ),
                  ],
                );
              },
            );
          }
        },
      ),
    );
  }
}

错误

The getter 'uid' was called on null.
Receiver: null
Tried calling: uid

【问题讨论】:

  • 你怎么称呼这个ClientiPage({Key key, this.instructor})
  • 你的意思是我如何通过RegisterState的导师?
  • 检查我的答案。我的意思是 ClientiPage 被调用可能是这样的:ClientiPage(instructor: currentUser),那么你将什么作为值传递给 instructor 属性

标签: firebase flutter dart google-cloud-firestore firebase-authentication


【解决方案1】:

instructor 是类ClientiPage 中的一个实例变量,这就是为什么您可以使用属性widget 访问它的原因。但是您似乎没有正确初始化它。

uid 将检索当前登录的用户 ID,您不必在构造函数中或从其他屏幕传递它,因此您可以执行以下操作:

 void saveChatRoom() async {
    String userId  = (await FirebaseAuth.instance.currentUser()).uid;
    DocumentReference chatroomIdRef = db.collection('instructori').document(userId).collection("chatrooms").document(chatRoomID);

    if (chatroomIdRef == null) {
      db.collection('instructori').document(userId).collection("chatrooms").document(chatRoomID);
    }  
  }

只要用户登录,就可以使用以下代码(await FirebaseAuth.instance.currentUser()).uid检索uid。无需在屏幕之间传递它。

https://pub.dev/packages/firebase_auth

【讨论】:

  • 好的,所以我尝试实施您的答案,但现在我遇到了更多错误,xd。其中一个是 await 表达式只能在异步函数中使用,另一个是 getter 实例没有为 FirebaseUser 定义,另一个是 FirebaseUser 参数类型不能分配给字符串。
  • 这里需要写asyncvoid saveChatRoom()async {
  • 哎呀我的错,我更新了答案,请检查。使用 await 时需要编写 async 且 uid 的类型为 String @EneCristianLuis
  • FirebaseAuth.instance 与数据的结构无关。它只检索一个 firebase auth 实例。
猜你喜欢
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
  • 2020-07-14
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多