gpt4 book ai didi

firebase - 我应该如何在Flutter应用中使用FirebaseAuth.instance.onAuthStateChanged?

转载 作者:行者123 更新时间:2023-12-03 04:56:19 24 4
gpt4 key购买 nike

在我的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;
}

关于firebase - 我应该如何在Flutter应用中使用FirebaseAuth.instance.onAuthStateChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60579449/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com