[英]How am I supposed to use FirebaseAuth.instance.onAuthStateChanged in my flutter app?
在我的 flutter 應用程序中,我嘗試使用 Provider 包中的 ChangeNotifier 將 Firebase 用戶對象傳遞給降序小部件。 我的第一個想法是在 StreamBuilder 中這樣做:
Widget _authBuilder(context, Widget body) {
final authModel = Provider.of<FAAuthModel>(context);
return StreamBuilder(
stream: FirebaseAuth.instance.onAuthStateChanged,
builder: (context, snapshot) {
authModel.user = snapshot.data;
return body;
},
);
}
唯一的問題是,顯然構建器函數在構建主體小部件時異步運行,因此狀態同時被標記為臟。 有沒有更聰明的方法將 FirebaseUser 傳遞給降序小部件樹?
I/flutter (28504): ══╡ EXCEPTION CAUGHT BY FOUNDATION LIBRARY ╞════════════════════════════════════════════════════════
I/flutter (28504): The following assertion was thrown while dispatching notifications for FAAuthModel:
I/flutter (28504): setState() or markNeedsBuild() called during build.
I/flutter (28504): This _DefaultInheritedProviderScope<FAAuthModel> widget cannot be marked as needing to build because
I/flutter (28504): the framework is already in the process of building widgets. A widget can be marked as needing to
I/flutter (28504): be built during the build phase only if one of its ancestors is currently building. This exception
I/flutter (28504): is allowed because the framework builds parent widgets before children, which means a dirty
I/flutter (28504): descendant will always be built. Otherwise, the framework might not visit this widget during this
I/flutter (28504): build phase.
I/flutter (28504): The widget on which setState() or markNeedsBuild() was called was:
I/flutter (28504): _DefaultInheritedProviderScope<FAAuthModel>
I/flutter (28504): The widget which was currently being built when the offending call was made was:
I/flutter (28504): StreamBuilder<FirebaseUser>
I/flutter (28504):
所以這個問題的答案是你不應該使用 StreamBuilder 而應該使用監聽器。
Widget _authBuilder(context, Widget body) {
Stream<FirebaseUser> stream;
final authModel = Provider.of<FAAuthModel>(context);
stream = FirebaseAuth.instance.onAuthStateChanged;
stream.listen((snapshot) {
/* We are not logged in */
if (snapshot == null && authModel.user == null) {
//Do nothing
}
/* We are not logged in, or we are logging out */
else if (snapshot == null) {
authModel.user = null;
/* We are logged in but we just opened our app */
} else if (authModel.user == null) {
authModel.user = snapshot;
/* We are logged in but something happened e.g. the widget tree was rebuilt and we just logged out? */
} else if (authModel.user.uid != snapshot.uid) {
authModel.user = snapshot;
}
});
return body;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.