You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中Riverpod AsyncNotifier状态丢失致注册信息被覆盖

问题排查与解决方案

问题根源

生产环境中第二步读取signUpProvider.value得到初始空值,核心原因是:

  • Riverpod的AsyncNotifierProvider默认在无监听者时自动销毁状态。第一步页面跳转后,原页面被销毁,signUpProvider失去监听者,状态重置为build方法初始化的UserProfile.empty()。本地调试时页面未完全销毁(如热重载保留状态),所以功能正常。

解决方案

方案1:让Provider状态持久化(保留本地状态)

修改signUpProvider的定义,添加.keepAlive()强制状态不被销毁:

final signUpProvider = AsyncNotifierProvider<SignUpViewModel, UserProfile>(
  () => SignUpViewModel(),
)..keepAlive();

此方法确保即使无监听者,Provider的状态也会被保留,第二步页面能读取到第一步更新后的用户信息。

方案2:直接从Firebase读取用户信息(生产环境更可靠)

依赖本地状态存在销毁风险,建议第二步直接从Firebase拉取已保存的基础信息,再合并更新:

  1. 在AuthenticationRepository中实现读取当前用户信息的方法:
Future<UserProfile?> getCurrentUserProfile() async {
  final currentUser = FirebaseAuth.instance.currentUser;
  if (currentUser == null) return null;
  
  final profileDoc = await FirebaseFirestore.instance
      .collection('profiles')
      .doc(currentUser.uid)
      .get();
  
  return profileDoc.exists ? UserProfile.fromJson(profileDoc.data()!) : null;
}
  1. 修改第二步的更新逻辑:
// 替换原读取signUpProvider的代码
final authRepo = ref.read(authenticationRepositoryProvider); // 假设已全局注入该Repository
final currentUserProfile = await authRepo.getCurrentUserProfile();

if (currentUserProfile != null) {
  final updateProfile = currentUserProfile.copyWith(
    region: widget.region,
    smallRegion: widget.smallRegion,
    community: _communityController.text,
  );

  await ref.read(userProvider.notifier)
      .updateProfileUI(updateProfile)
      .then((_) {
        slideNavigation(context, const MainNavigationScreen(tab: "일기"));
      });
}

额外优化:完善错误处理

在第一步的createProfileUI中添加错误捕获,避免状态更新异常:

Future<void> createProfileUI(UserProfile userData) async {
  state = const AsyncValue.loading();
  try {
    await _authRepo.createProfileDB(userData.toJson());
    state = AsyncValue.data(userData);
  } catch (e) {
    state = AsyncValue.error(e, StackTrace.current);
    // 此处可添加错误提示,如弹窗告知用户注册失败
  }
}

内容的提问来源于stack exchange,提问作者Hyejung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:57:19