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 데이터 (역할)에 따라 다른보기를 표시하려고합니다.
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가 미래가 해결 될 때까지 기다린 다음 코드로만 진행됩니다.
도움이 되었기를 바랍니다!
await 대신 .then을 사용하기 때문에 발생합니다.
.then을 사용하면 코드가 firebase 호출이 완료 될 때까지 기다리지 않고 실행되며 데이터가 없기 때문에 역할이 null로 print됩니다.따라서 사용자 데이터를 얻으려면 await를 사용해야합니다.
향후 빌더를 사용하거나 사용자 데이터를 얻은 후에 다른 접근 방식을 사용하여 UI를 업데이트 할 수 있습니다.