【发布时间】: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 值,并且仅当每个属性的值不为空时才保存。
-
如何做到这一点,你能发布一些代码吗?