Riverpod - 获取当前用户的状态通知程序始终为空

问题描述

我有这个状态通知程序来获取当前用户

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( 显示它已填充但它也运行太频繁:

enter image description here

我认为这个位总是将它设置回 null,因为它也经常运行:

final userProvider = StateNotifierProvider<UserNotifier,User?>((ref) {
  return UserNotifier(null);
});

我不确定我可以传入什么而不是 null。

解决方法

使状态通知程序的实例成为全局变量,以便在调用 ref.read(userProvider) 时不会重新实例化它:

var currentUser = UserNotifier();

final userProvider = StateNotifierProvider<UserNotifier,User?>((ref) {
  return currentUser;
});

非常愿意接受改进建议,因为我不确定这是否意味着要完成...我可以在没有全局变量的情况下实现相同的结果吗?