Идентификатор getter, вызываемый нулем в трепетном огне - PullRequest
0 голосов
/ 25 января 2020

Я пытаюсь объединить два UID для создания чата. Один uid читается из firebase, а другой читается из FirebaseAuth.instance.

ClientUID назначается, как и должно быть, так как я передаю его на другую страницу в текстовом виджете. Однако чат-комната не создается в дереве 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

1 Ответ

2 голосов
/ 25 января 2020

instructor является переменной экземпляра в классе ClientiPage, поэтому вы можете получить к ней доступ, используя свойство widget. Но, похоже, вы не инициализируете его правильно.

uid будет извлекать текущий зарегистрированный идентификатор пользователя, вам не нужно передавать его внутри конструктора или из другого экрана, поэтому вы можете сделать следующее :

 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);
    }  
  }

Пока пользователь вошел в систему, вы можете получить uid, используя следующий код (await FirebaseAuth.instance.currentUser()).uid. Нет необходимости передавать его с экрана на экран.

https://pub.dev/packages/firebase_auth

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...