我有这个状态通知程序来获取当前用户:
import 'dart:async';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final userProvider = StateNotifierProvider<UserNotifier, User?>((ref) {
return UserNotifier(null);
});
class UserNotifier extends StateNotifier<User?> {
UserNotifier(User? state) : super(state) {
FirebaseAuth.instance.authStateChanges().listen((user) {
if (user == null) {
clearUser();
} else {
setUser(user);
}
});
}
void setUser(User user) {
state = user;
}
void clearUser() {
state = null;
}
}
我在我的 Http 客户端中使用它来获取 id 令牌:
final Provider<Dio> httpClientProvider = Provider<Dio>((ref) {
final dio = Dio(BaseOptions(baseUrl: EnvironmentConstants.of().apiUrl));
final localDataSource = ref.read(localStorageDataSourceProvider);
final user = ref.read(userProvider);
String? accessToken = localDataSource.get<dynamic>(
keyToRead: 'access_token')['access_token_value'] as String?;
accessToken = accessToken ?? user?.getIdToken() as String;
问题是 HttpProvider 中 user
的值始终为 null。
所以 final user = ref.read(userProvider);
总是返回 null。
FirebaseAuth.instance.authStateChanges().listen(
显示它已填充但它也运行太频繁:
我认为这个位总是将它设置回 null,因为它也经常运行:
final userProvider = StateNotifierProvider<UserNotifier, User?>((ref) {
return UserNotifier(null);
});
我不确定我可以传入什么而不是 null。
答案 0 :(得分:0)
使状态通知程序的实例成为全局变量,以便在调用 ref.read(userProvider)
时不会重新实例化它:
var currentUser = UserNotifier();
final userProvider = StateNotifierProvider<UserNotifier, User?>((ref) {
return currentUser;
});
非常愿意接受改进建议,因为我不确定这是否意味着要完成...我可以在没有全局变量的情况下实现相同的结果吗?