在我的应用程序中,我有以下提供商。
@override
Widget build(BuildContext context) {
return OverlaySupport.global(
child: MultiProvider(
providers: [userLoggedIn, currentUserData],
child: MaterialApp(...)))
}
var userLoggedIn = StreamProvider<User?>.value(
value: FirebaseAuth.instance.authStateChanges(), initialData: null);
var currentUserData = StreamProvider<FrediUser>.value(
updateShouldNotify: (_, __) => true,
initialData: FrediUser(
loginProvider: '',
email: '',
admin: false,
profileSettings: [],
profileChips: [],
profileStats: [],
id: 'loading',
imageUrl: 'loading',
bio: 'loading',
username: 'loading'),
value: currentUserID != null ? currentUserDataStream() : null,
);
问题
当用户注销(或首次登录)时,提供程序为:
- 包含旧用户数据(直到热重启完成,再次调用并重新加载提供程序)
- Null或空,因为之前没有用户。
- 我想做的是**在有了新用户后再次刷新或调用
Stream Providers
,或者在用户注销后删除所有数据。
- 我想做的是**在有了新用户后再次刷新或调用
谢谢大家!
3条答案
按热度按时间py49o6xq1#
您可以像这样监听auth状态的变化。
wrrgggsh2#
我也遇到过与您类似的问题,我提出了一个解决方案,但不确定它在
Provider
体系结构中是否"有效问题
我有一个
DatabaseService
类,它有一个Stream<CustomUser>
函数类型的流函数,我是这样使用它的:流函数:
databaseService是具有命名构造函数的DatabaseService类。
这***不会***导致小部件在开始时重建,也不会在流具有新值时重建
溶液:
在
DatabaseService
类中创建了一个StreamController
,当用户登录时,我添加了流函数:getCurrUserFromDB()
到StreamController
,就像这样setInitUser(CustomUser? user)
用于设置DatabaseService
中_user
变量的值,user
用于获取此变量。推理
我***在应用程序启动时创建***
StreamProvider
,其源StreamController
需要有一个流来侦听,所以我在尝试登录时提供了它。或者更干净的解决方案是在
DatabaseService
类的构造函数中这样做:最后一点要注意的是,我没有声明控制器为final,当我声明为final时,流没有更新,所以现在看起来像这样:
TL; DR
我创建了一个
StreamProvider
,它在其create属性中返回一个StreamController
,后来在应用程序的生命周期中,我使用addStream方法为控制器提供了一个Stream。抱歉,墙上的文字,我只是想出来尽可能清楚。
7y4bm7vi3#
如果要控制何时可以重新生成
StreamProvider
,可以尝试使用来自StreamController
的Stream
,而不是返回流的Function
。使用
StreamController
允许您使用以下命令向其流添加值:streamController.sink.add(event);
。执行此操作将***刷新***流,从而允许您更新UI。我在本例中使用Firebase,因此代码片段可能包含一些
FirebaseAuth
方法。溶液
我创建了一个名为
auth_helper.dart
的类来处理身份验证。我正在
main.dart
中调用此函数在
runApp()
之前调用它,以便我的currUserController
在Firebase初始化之后立即开始侦听Auth更改。MultiProvider
现在将如下所示最后,这是手动/编程更新流的方法
source code