ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 역할 기반 홈 뷰에 flutter를 사용하여 Firestore에서 데이터 가져오기
    카테고리 없음 2020. 8. 14. 15:54

    질문

    class Authservice {
    handleAuth() {
     return StreamBuilder(
     stream: FirebaseAuth.instance.onAuthStateChanged,
        builder: (BuildContext context, snapshot) {
    if (snapshot.hasData) {
            var role;
            Firestore.instance
                .collection('users')
                .document(snapshot.data.uid)
                .get()
    .then((DocumentSnapshot ds) {
              role = ds.data['role'];
            });
            print('role');
            print(role);
            if (role == 'user') {
              return OwnerHome();
            } else {
              return CustomerHome();
    }
          } else {
            return Signin();
          }
        });  
    }

    역할은 null 값을 print합니다.로그인 한 사용자의 firestore 데이터 (역할)에 따라 다른보기를 표시하려고합니다.


    답변1

    Firebase 메소드는 비동기식 이므로 향후 해결 될 Future를 반환합니다. 따라서 여기 코드에서 Firebase Document get 메서드는 아직 해결되지 않은 future를 반환하므로 역할에 대해 null 값을 print합니다. 빌더 메서드 내에서 asyn-await를 사용할 수 없으므로 FutureBuilder <를 사용할 수 있습니다. / code>이 문제를 해결하는 위젯, 코드는 다음과 같습니다.

    class Authservice {
      handleAuth() {
        return StreamBuilder(
          stream: FirebaseAuth.instance.onAuthStateChanged,
          builder: (BuildContext context, snapshot) {
            if (snapshot.hasData) {
              return FutureBuilder<DocumentSnapshot>(
                future: Firestore.instance
                    .collection('users')
                    .document(snapshot.data.uid)
                    .get(),
                builder: (BuildContext context,
                    AsyncSnapshot<DocumentSnapshot> snapshot) {
                  if (snapshot.hasData) {
                    DocumentSnapshot ds = snapshot.data;
                    role = ds.data['role'];
                    print('role');
                    print(role);
                    if (role == 'user') {
                      return OwnerHome();
                    } else {
                      return CustomerHome();
                    }
                  } else {
                    //Handle whenn user does not exists!
                  }
                },
              );
            } else {
              return Signin();
            }
          },
        );
      }
    }

    보시다시피 코드에 FutureBuilder 를 추가했습니다. 그러면 Firebase Document가 미래가 해결 될 때까지 기다린 다음 코드로만 진행됩니다.

    도움이 되었기를 바랍니다!



    답변2

    await 대신 .then을 사용하기 때문에 발생합니다.

    .then을 사용하면 코드가 firebase 호출이 완료 될 때까지 기다리지 않고 실행되며 데이터가 없기 때문에 역할이 null로 print됩니다.따라서 사용자 데이터를 얻으려면 await를 사용해야합니다.

    향후 빌더를 사용하거나 사용자 데이터를 얻은 후에 다른 접근 방식을 사용하여 UI를 업데이트 할 수 있습니다.



     

     

     

     

    출처 : https://stackoverflow.com/questions/62736449/get-data-from-firestore-using-flutter-for-role-base-home-view

    댓글

Designed by Tistory.