Flutter - 空安全和模型
Flutter - null safety and models
一段时间后我又回到了 Flutter(同时引入了空安全)。我最终需要更新一个项目。假设在那个项目中我有一个用户模型。我设法更新了大部分项目,但让我头疼的部分是注销操作。需要清除用户(注销后),我需要将其设置为 null 或将其清空,但我当然会收到错误消息:
Unhandled Exception: type 'Null' is not a subtype of type 'User'
所以我的问题是什么是最好的策略,不仅要清除用户,还要清除我为 redux 状态拥有的任何其他模型,而不会遇到模型不能为空的问题?
用户模型:
class User {
String id;
String username;
String email;
String jwt;
User({ required this.id, required this.username, required this.email, required this.jwt });
factory User.fromJson(Map<String, dynamic> json) {
return User (
id: json['id'],
username: json['username'],
email: json['email'],
jwt: json['jwt']
);
}
}
用户操作:
/* User actions */
ThunkAction<AppState> getUserAction = (Store<AppState> store) async {
final prefs = await SharedPreferences.getInstance();
final String? storedUser = prefs.getString('user');
final user = storedUser != null ? User.fromJson(json.decode(storedUser)) : null;
if(user != null) {
store.dispatch(GetUserAction(user));
}
};
ThunkAction<AppState> logoutUserAction = (Store<AppState> store) async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('user');
var user;
store.dispatch(LogoutUserAction(user));
};
class GetUserAction {
final User _user;
User get user => this._user;
GetUserAction(this._user);
}
class LogoutUserAction {
final User _user;
User get user => this._user;
LogoutUserAction(this._user);
}
注意:看看我是如何设法解决 getUserAction(登录)部分中的空值的。如果它为 null,我只是不发送操作,但是我不能在注销中执行此操作,因为我需要明确地将用户设置为 null(清除它),然后从应用程序中注销它。
我可以让模型接受空值吗?我该怎么做?或者我还有其他方法可以解决这个问题吗?谢谢您的热心回答。
将您的模型更改为:
class User {
String? id;
String? username;
String? email;
String? jwt;
User({ required this.id, required this.username, required this.email, required this.jwt });
factory User.fromJson(Map<String, dynamic> json) {
return User (
id: json['id'] ?? "",
username: json['username'] ?? "",
email: json['email'] ?? "",
jwt: json['jwt'] ?? ""
);
}
}
并且您需要检查 null_safety 所有具有操作 ??
的变量
注销后,您可以使用 user.id == ""
或 user == User()
检查用户 null
ThunkAction<AppState> logoutUserAction = (Store<AppState> store) async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('user');
var user = User();
store.dispatch(LogoutUserAction(user));
};
一段时间后我又回到了 Flutter(同时引入了空安全)。我最终需要更新一个项目。假设在那个项目中我有一个用户模型。我设法更新了大部分项目,但让我头疼的部分是注销操作。需要清除用户(注销后),我需要将其设置为 null 或将其清空,但我当然会收到错误消息:
Unhandled Exception: type 'Null' is not a subtype of type 'User'
所以我的问题是什么是最好的策略,不仅要清除用户,还要清除我为 redux 状态拥有的任何其他模型,而不会遇到模型不能为空的问题?
用户模型:
class User {
String id;
String username;
String email;
String jwt;
User({ required this.id, required this.username, required this.email, required this.jwt });
factory User.fromJson(Map<String, dynamic> json) {
return User (
id: json['id'],
username: json['username'],
email: json['email'],
jwt: json['jwt']
);
}
}
用户操作:
/* User actions */
ThunkAction<AppState> getUserAction = (Store<AppState> store) async {
final prefs = await SharedPreferences.getInstance();
final String? storedUser = prefs.getString('user');
final user = storedUser != null ? User.fromJson(json.decode(storedUser)) : null;
if(user != null) {
store.dispatch(GetUserAction(user));
}
};
ThunkAction<AppState> logoutUserAction = (Store<AppState> store) async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('user');
var user;
store.dispatch(LogoutUserAction(user));
};
class GetUserAction {
final User _user;
User get user => this._user;
GetUserAction(this._user);
}
class LogoutUserAction {
final User _user;
User get user => this._user;
LogoutUserAction(this._user);
}
注意:看看我是如何设法解决 getUserAction(登录)部分中的空值的。如果它为 null,我只是不发送操作,但是我不能在注销中执行此操作,因为我需要明确地将用户设置为 null(清除它),然后从应用程序中注销它。
我可以让模型接受空值吗?我该怎么做?或者我还有其他方法可以解决这个问题吗?谢谢您的热心回答。
将您的模型更改为:
class User {
String? id;
String? username;
String? email;
String? jwt;
User({ required this.id, required this.username, required this.email, required this.jwt });
factory User.fromJson(Map<String, dynamic> json) {
return User (
id: json['id'] ?? "",
username: json['username'] ?? "",
email: json['email'] ?? "",
jwt: json['jwt'] ?? ""
);
}
}
并且您需要检查 null_safety 所有具有操作 ??
的变量注销后,您可以使用 user.id == ""
或 user == User()
ThunkAction<AppState> logoutUserAction = (Store<AppState> store) async {
final prefs = await SharedPreferences.getInstance();
await prefs.remove('user');
var user = User();
store.dispatch(LogoutUserAction(user));
};