如何解决StreamProvider 和 Firebase
void main() async {
...
final AuthenticationProvider authenticationProvider = AuthenticationProvider();
await authenticationProvider.initialize();
runApp(
MultiProvider(
providers: [
Provider<AuthenticationProvider>(create: (_) => authenticationProvider),StreamProvider<UserModel>(
create: (_) => authenticationProvider.currentUser,initialData: UserModel(
id: '',email: '',displayName: '',photo: null,premium: false,travels: [],),)
],child: MiRoulotte(),);
}
我创建了一个提供程序,它生成一个包含当前用户数据的流,这些数据在用户注销或登录时会发生变化,但数据不会发生变化。当我退出时,流应该是空的,然后我登录时流应该是用户数据。
class AuthenticationProvider {
Stream<UserModel>? _currentUser;
Stream<UserModel>? get currentUser => this._currentUser;
initialize() async {
...
this._currentUser = FirebaseFirestore.instance
.collection('users')
.doc(FirebaseAuth.instance.currentUser?.uid)
.snapshots()
.map((user) => UserModel.fromJson(user.data() as Map<String,dynamic>));
...
}
Future signIn({required String email,required String password}) async {
...
this._currentUser = FirebaseFirestore.instance
.collection('users')
.doc(userCredential.user?.uid)
.snapshots()
.map((user) => UserModel.fromJson(user.data() as Map<String,dynamic>));
...
}
Future signOut() async {
...
this._currentUser = null;
...
}
}
解决方法
您实际上并不希望 Stream
为 null
,而是让它发出 null
值。 AuthenticationProvider
可以有一个 StreamController
,您可以使用它向流中添加当前用户对象的新值。
class AuthenticationProvider {
final StreamController _controller = SteamController<UserModel?>();
Stream<UserModel?> get userStream => _controller.stream;
Future<void> initialize() async {
final user = // get usermodel from firebase
_controller.add(user);
}
Future<void> signIn({required String email,required String password}) async {
...
final user = // get usermodel from firebase
_controller.add(user);
}
void signOut() {
_controller.add(null);
}
}
不要忘记在处理时关闭 StreamController
:
// in main
Provider<AuthenticationProvider>(
create: (_) => authenticationProvider,dispose: (provider) => provider.dispose(),),// in AuthenticationProvider
void dispose() {
_controller.close();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。