【问题标题】:SharedPerference key returning null value in FlutterSharedPerference 键在 Flutter 中返回空值
【发布时间】:2022-11-20 01:44:04
【问题描述】:

我创建了一个user model,我在其中保存所需的数据以保存在sharedperference 中,这样如果用户终止该应用程序,我就可以从sharedperference 中获取它。这是我的用户模型。

class UserModel {
  String? token;
  String? userId;
  String? stripeId;
  String? userName;
  String? userEmailAddress;
 
  UserModel({this.activeCardId,this.token,this.userId,this.stripeId,this.userName});

  UserModel.fromJson(Map<String, dynamic> json) {
    token = json['token'];
    userId = json['user_id'];
    stripeId = json['stripe_id'];
    userName=json['fullname'];
    userEmailAddress=json['email'];

  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data =  <String, dynamic>{};
    data['token'] = token;
    data['user_id'] = userId;
    data['stripe_id'] = stripeId;
    data['fullname']=userName;
    data['email']=userEmailAddress;
    return data;
  }
}

这是我的sharedperference类代码,我为此使用了provider状态管理


class UserViewModel with ChangeNotifier{

  Future<bool> saveUser(UserModel user)async{

    final SharedPreferences sp = await SharedPreferences.getInstance();
    sp.setString('token', user.token.toString());
    sp.setString('user_id',user.userId.toString());
    sp.setString('stripe_id',user.stripeId.toString());
    sp.setString('userName',user.userName.toString());
    sp.setString('userEmailAddress',user.userEmailAddress.toString());
    notifyListeners();
    return true ;
  }

  Future<UserModel> getUser()async{

    final SharedPreferences sp = await SharedPreferences.getInstance();
    final String? token = sp.getString('token');
    final String? userId = sp.getString('user_id');
    final String? stripeId=sp.getString('stripe_id');
    final String? userName=sp.getString('userName');
    final String? userEmailAddress=sp.getString('userEmailAddress');

    return UserModel(
      token: token.toString(),
      userId: userId.toString(),
      stripeId: stripeId.toString(),
      userName:userName.toString(),
      userEmailAddress:userEmailAddress.toString(),
    );
  }

  Future<bool> remove()async{

    final SharedPreferences sp = await SharedPreferences.getInstance();
    sp.remove('token');
    return true;

  }
}

这就是我保存从登录 API 响应中获取的数据并在登录屏幕上使用此代码的方式

final userPreference =Provider.of<UserViewModel>(context, listen: false);
userPreference.saveUser(UserModel(userId: value['data']['id'].toString()));

这就是我使用 Drawer Widget 类的代码从 sharedPrefernce 获取数据的方式

Future<UserModel> getUserDate() => UserViewModel().getUser();
    getUserDate().then((value)async{
      setState(() {
      GlobalVariables.token=value.token.toString();
      });
   });

问题

问题是我需要在 sharedpreference 上保存 stripe_id 所以当用户登录时有一个名为添加卡的屏幕当用户点击按钮时 API 命中并且在它的响应中我得到 stripe_id 并将其保存到 @987654333 @ 与我保存的登录响应、数据相同。但是当我回到Drawer Widget 类时,它打印了token 的空值。当我不在 sharedpreference 上保存 stripe_id 时,它工作正常。

这是我如何保存的代码 stripe_id

final userPreference =Provider.of<UserViewModel>(context,listen: false);
userPreference.saveUser(UserModel(stripe_id: createCard['id'].toString()));

但是,当我像这样执行上面的代码时

final userPreference =Provider.of<UserViewModel>(context,listen: false);
userPreference.saveUser(UserModel(stripe_id: createCard['id'].toString()));
userPreference.saveUser(UserModel(token: "22424"));

我得到token"22424",但我不想这样做。我的观点是,在将其他数据保存在其他键上后,共享偏好数据为空。

请帮助我做错的地方。

【问题讨论】:

  • 每次调用userPreference.saveUser()时,你只是用空值覆盖
  • 您正在传递具有选定值(如 stripe_id 或 token 或 user_id)的 User 对象,并将其他值保持为空,然后当您调用 saveUser 方法时,您仅保存传递的值,同时将其他值保存为 NULL。
  • 所以你的意思是每次当我需要先保存其他值时,我需要将它们存储在其他变量上然后再次保存它们?
  • 您应该检查每个值的 NULL 值,并且仅当每个属性的值不为空时才保存。
  • 如何做到这一点,你能发布一些代码吗?

标签: flutter sharedpreferences


【解决方案1】:

每次使用具有 NULL 属性值的 User 对象调用 userPreference.saveUser() 时,您只是用空值覆盖。

您正在传递具有选定值(如 stripe_id 或 token 或 user_id)的 User 对象,并将其他值保持为空,然后当您调用 saveUser 方法时,您仅保存传递的值,同时将其他值保存为 NULL。

更新你的保存用户方法与此:

Future<bool> saveUser(UserModel user) async {
  final SharedPreferences sp = await SharedPreferences.getInstance();

  if (user.token != null) sp.setString('token', user.token.toString());
  if (user.userId != null) sp.setString('user_id', user.userId.toString());
  if (user.stripeId != null) sp.setString('stripe_id', user.stripeId.toString());
  if (user.userName != null) sp.setString('userName', user.userName.toString());
  if (user.userEmailAddress != null) sp.setString('userEmailAddress', user.userEmailAddress.toString());

  notifyListeners();
  return true;
}

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 2021-04-14
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2020-03-08
    相关资源
    最近更新 更多