当我在 flutter 应用程序中从一个屏幕切换到另一个屏幕时,我的代码正在丢失状态

问题描述 投票:0回答:1

我有一个 flutter 应用程序,其中新用户被带到用户个人资料屏幕。他们可以在这里输入更多信息并保存数据。

在 save 方法之前,我将所有数据放入 Riverpod NotifierProvider 中,并将这些数据传递给 save 方法。这个效果很好。

保存新用户信息后,他们将进入公司资料屏幕,可以在其中输入有关其公司的所有数据。

保存公司后,我检索公司文档 ID,并希望将其保存到用户记录中,以便将它们链接起来。

但是,在保存新用户和保存公司之间的某个时间,我丢失了用户 NotifierProvider 中的所有数据。在尝试将公司 ID 保存到用户记录中之前,我没有收到任何错误。

两个屏幕都扩展了 ConsumerState,如果有帮助的话。

我已经能够将范围缩小到以下代码:

我将用户数据传递给保存方法

ref.read(usersNotifierProvider.notifier).
saveUser(ref.read(globalsNotifierProvider), ref.read(usersNotifierProvider),);

方法是这样的:

saveUser(globals, user) async {
    if (ref.watch(globalsNotifierProvider).newUser == true) {
      // final DocumentSnapshot currentCompanyProfile =
      final newUser = Users(
        userId: user.userId,
        fName: user.fName,
        lName: user.lName,
        mls: user.mls,
        mlsId: user.mlsId,
        address1: user.address1,
        address2: user.address2,
        city: user.city,
        userState: user.userState,
        zipCode: user.zipCode,
        cellPhone: user.cellPhone,
        officePhone: user.officePhone,
        companyId: globals.companyId,
        companyName: user.companyName,
        email: user.email,
        businessType: user.businessType,
        deviceToken: user.deviceToken,
      );
      firestoreService.saveNewUser(toMap(newUser));
      ref.read(globalsNotifierProvider.notifier).updatenewUser(false);
    } else {
      final DocumentSnapshot currentuserProfile =
          await userDB.doc(user.UserId).get();

      var newUser = Users(
          userId: ref.read(globalsNotifierProvider).currentUid,
          fName: (state.fName != null && state.fName != "")
              ? state.fName
              : currentuserProfile.get('fName'),
          lName: (state.lName != null && state.lName != "")
              ? state.lName
              : currentuserProfile.get('lName'),
          address1: (state.address1 != null && state.address1 != "")
              ? state.address1
              : currentuserProfile.get('address1'),
          address2: (state.address2 != null && state.address2 != "")
              ? state.address2
              : currentuserProfile.get('address2'),
          city: (state.city != null && state.city != "")
              ? state.city
              : currentuserProfile.get('city'),
          userState: (userState != null && userState != "")
              ? userState
              : currentuserProfile.get('state'),
          /*state: (globals.selectedState != null)
              ? globals.selectedState
              : globals.currentuserState,*/
          zipCode: (state.zipCode != null && state.zipCode != "")
              ? state.zipCode
              : currentuserProfile.get('zipCode'),
          cellPhone: (state.cellPhone != null && state.cellPhone != "")
              ? state.cellPhone
              : currentuserProfile.get('cellPhone'),
          officePhone: (state.officePhone != null && state.officePhone != "")
              ? state.officePhone
              : currentuserProfile.get('officePhone'),
          companyId: companyId,
          companyName: (state.companyName != null && state.companyName != "")
              ? state.companyName
              : currentuserProfile.get('Company'),
          mlsId: ref.read(globalsNotifierProvider).mlsId,
          mls: (state.mls != null && state.mls != "")
              ? state.mls
              : currentuserProfile.get('mls'),
          deviceToken: (state.deviceToken != null && state.deviceToken != "")
              ? state.deviceToken
              : currentuserProfile.get('deviceToken'));
      businessType:
      ref.read(globalsNotifierProvider).userBusinessType;

      firestoreService.saveUser(
          newUser, ref.read(globalsNotifierProvider).currentUserId!);
    }

这是我实际保存的地方:

  Future<void> saveNewUser(users) {
    return _db.collection('users').add(users);
  }

当我保存数据回来时,提供程序是空的。

谢谢

flutter riverpod
1个回答
0
投票

我删除了这一行并且它起作用了:

  firestoreService.saveNewUser(toMap(newUser));
  ref.read(globalsNotifierProvider.notifier).updatenewUser(false); <<<< REMOVED
© www.soinside.com 2019 - 2024. All rights reserved.