개발/Flutter
Flutter, Null Safety 이후의 Provider, Model, SharedPreferences 관계 사용하기
Seobs
2021. 7. 31. 18:29
Flutter가 Null Safety를 지원하면서 기존에 쓰던 관계를 그대로 사용하기가 아주 어려워졌습니다. (개인적으로)
https://flutter.dev/docs/null-safety
Null safety in Flutter
Find out how to use non-nullable types in your Flutter code.
flutter.dev
기존에 Provider 환경에서 User Model과 SharedPreference를 쓰던 방법이 많이 바뀌어서 한 번 공유해보겠습니다.
실행이 되기 위한 수정방법이기 때문에 많이 부족할 수 있습니다.
Before
login
Provider.of<UserProvider>(context, listen: false).setUser(user);
UserProvider
class UserProvider with ChangeNotifier {
User _user = new User();
User get user => _user;
void setUser(User user) {
_user = user;
}
}
User
class User {
int userId;
String userEmail;
User({this.userId, this.userEmail});
factory User.fromJson(Map<String, dynamic> responseData) {
return User(
userId: responseData['id'],
userEmail: responseData['email']
);
}
}
User SharedPreference
class UserSharedPreference {
Future<bool> saveUser(User user) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt("userId", user.userId);
prefs.setString("userEmail", user.userEmail);
return prefs.commit();
}
Future<User> getUser() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
int userId = prefs.getInt("userId");
String userEmail = prefs.getString("userEmail");
return User(userId: userId, userEmail: userEmail);
}
After
login은 달라지지 않았습니다.
기존에는 UserProvider에서 new User()로 초기화를 해줬지만 그러다 보니 Model에서 Null Safety 이슈가 발생했습니다.
그래서 Model에서 Null을 허용하니 SharedPreference에서 set을 할 때 Null을 허용하지 않고, get을 할 때는 또 Null이 될 수 있다고 해서 이걸 어떻게 풀어내야 할지 많이 고민했습니다.
그래서 UserProvider에서는 User에 late를 사용하게 되었고 Model에서도 일단은 임시로 fromJson을 쓰는 방향으로 갔습니다.
UserProvider
class UserProvider with ChangeNotifier {
late User _user;
User get user => _user;
void setUser(User user) {
_user = user;
}
}
User
class User {
final int id;
final String email;
User({required this.id, required this.email});
User.fromJson(Map<String, dynamic> responseData)
: id = responseData['id'],
email = responseData['email'];
}
User SharedPreference
class UserSharedPreference {
Future<bool> saveUser(User user) async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setInt("userId", user.id);
prefs.setString("userEmail", user.email);
return prefs.commit();
}
Future<User> getUser() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
int? userId = prefs.getInt("userId");
String? userEmail = prefs.getString("userEmail");
return User.fromJson({'id': userId, 'email': userEmail});
}