StreamBuilder trả về null

Aug 31 2020

Tôi gặp một số vấn đề với việc sử dụng firebaseUser ID trong ứng dụng của mình để lấy thông tin từ firebase. Tôi đã tạo tabBar chuyển đổi giữa các StreamBuilders lưu trữ danh sách các khối dựa trên dữ liệu từ Firestore theo Id người dùng được lấy từ authStateChanges.

Các hàm của tôi lấy dữ liệu:

 getFavSalons(AsyncSnapshot<QuerySnapshot> snapshot) {
return snapshot.data.docs
    .map((doc) => SalonBlock(
          salonName: doc.data()["salonName"],
          location: doc.data()["location"],
          workTime: doc.data()["workTime"],
          rating: doc.data()["rating"],
        ))
    .toList();  }   

  getFavMasters(AsyncSnapshot<QuerySnapshot> snapshot) {
return snapshot.data.docs
    .map((doc) => MasterBlock(
          fullname: doc.data()["fullName"],
          bio: doc.data()["bio"],
          rating: doc.data()["rating"],
        ))
    .toList();   }

StreamBuilder của tôi trong TabBarView:

Container(
            height: screenHeight * 0.9,
            width: screenWidth,
            child:
                TabBarView(controller: _controllerTabs, children: <Widget>[
              StreamBuilder(
                  stream: FirebaseAuth.instance.authStateChanges(),
                  builder: (context, AsyncSnapshot<User> snapshot) {
                    if (snapshot.hasData) {
                      return StreamBuilder(
                          stream: FirebaseFirestore.instance
                              .collection("customers")
                              .doc(snapshot.data.uid)
                              .collection("favSalons")
                              .snapshots(),
                          builder: (context,
                              AsyncSnapshot<QuerySnapshot> snapshot) {
                            if (snapshot.hasData) {
                              return Container(
                                margin: EdgeInsets.only(
                                    bottom: screenHeight * 0.33),
                                child: new ListView(
                                  children: getFavSalons(snapshot),
                                ),
                              );
                            }
                            return LoadingSalon();
                          });
                    }
                   return Text("Loading user...");
                  }),
              StreamBuilder(
                  stream: FirebaseAuth.instance.authStateChanges(),
                  builder: (context, AsyncSnapshot<User> snapshot) {
                    if (snapshot.hasData) {
                      return StreamBuilder(
                          stream: FirebaseFirestore.instance
                              .collection("customers")
                              .doc(snapshot.data.uid)
                              .collection("favMasters")
                              .snapshots(),
                          builder: (context,
                              AsyncSnapshot<QuerySnapshot> snapshot) {
                            if (snapshot.hasData) {
                              return Container(
                                margin: EdgeInsets.only(
                                    bottom: screenHeight * 0.33),
                                child: new ListView(
                                  children: getFavMasters(snapshot),
                                ),
                              );
                            }
                            return LoadingSalon();
                          });
                    }
                    return Text("Loading user...");
            ]),

Khi tôi chạy ứng dụng của mình ở đầu dữ liệu tồn tại trong các khối, nhưng khi tôi cố gắng chuyển đổi giữa các tab thì có lỗi "StreamBuilder đã trả về null". Tôi nghĩ rằng có một số rắc rối với authStateChanges (). Làm cách nào để khắc phục sự cố này?

Trả lời

1 galloper Aug 31 2020 at 18:35

Điều này có thể xảy ra vì TabBarView tạo lại các tab của bạn khi bạn chuyển đổi chúng. Có các giải pháp khác nhau cho vấn đề này, không để các câu trả lời trùng lặp, hãy kiểm tra chúng tại đây: Trạng thái duy trì giữa các trang xem tab