Flutter, Null Safety 이후의 Provider, Model, SharedPreferences 관계 사용하기

2021. 7. 31. 18:29개발/Flutter

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});
  }

'개발 > Flutter' 카테고리의 다른 글

Flutter, 설치부터 실행까지  (0) 2019.04.14