[ flutter ] 냥이월드 - KakaoUser 로그인 이후 load 이슈?!?!

 

[ Flutter ] 카카오 간편 로그인 - 1. 코드분석

// Future --> "미래에 무엇무엇을 가져올것이다." 라는걸 알려줌Future checkKakaoLogin() async { // 토큰 담을 변수 OAuthToken token; // 회원 정보 User userInfo; // 카카오톡이 깔려 있는지 여부를 확인하는 isKakaoTa

coxemonkey.tistory.com

 

전에 카카오 간편 로그인 하면서 데이터 저장하고 그렇게 작업을 했습니다.

그러다 이번에 UserPerferences 쪽엣 loadUser 이라는 함수를 통해 데이터를 가져올려고 하니, 에러가 발생!

원인을 분석하다보니 json 형태가 다른것을 확인 했습니다.

 

>>> UserPerference 에서 user 데이터 저장하는 부분

static Future<void> saveUser(KakaoUser user) async {
    // 1. SharedPreferences 인스턴스 가져오기
    final prefs = await SharedPreferences.getInstance();

    final userMap = user.toJson();

    final userJson = jsonEncode(userMap);

    await prefs.setString(_keyUser, userJson);
  }

 

  Future<KakaoUser?> _checkKakaoLogin() async {
      User userInfo;
      OAuthToken token;

      if (await isKakaoTalkInstalled()) {
        print('Kakao App Login');
        token = await UserApi.instance.loginWithKakaoTalk();
      } else {
        print('Kakao Login');
        token = await UserApi.instance.loginWithKakaoAccount();
      }

      print('Get Kakao user');
      userInfo = await UserApi.instance.me();

      KakaoUser userData = KakaoUser.fromJson(userInfo.toJson());
      userData.setToken(token);

      await UserPreferences.saveUser(userData);

      return userData;
  }

위 코드에서 토큰 받고, 내 계정 정보를 userInfo 에 넣고, models 에서 만들어 두었던, KakaoUser.class를 이용해서 KakaoUser.fromJson 을 하는 것.

 

fromJson은 보통 데이터 가져오는걸 json 형태로 맞춰서 그대로 가져오는데, 문제는 toJson을 하면서 일치하지 않게 데이터를 나눠주는 바람에 문제가 발생했습니다.

 

  // fromJson으로 json 파일 담아와서 현 KakaoUser에 대입시켜주기
  factory KakaoUser.fromJson(Map<String, dynamic> json) {
    return KakaoUser(
      id: json["id"],
      nickname: json["properties"]["nickname"],
      profileImage: json["properties"]["profile_image"],
      email: json["kakao_account"]?["email"],
      connectedAt: json["connected_at"] != null
          ? DateTime.parse(json["connected_at"])
          : null,
    );
  }

KakaoUser.fromJson()

 

  Map<String, dynamic> toJson() {
    return {
      "id": id,
      "nickname": nickname,
      "profile_image": profileImage,
      "email": email,
      "connected_at": connectedAt?.toIso8601String(),
    };
  }

KakaoUser.toJson()

 

이렇게 되어 어떻하냐.. 싶다가 로컬용으로 따로 하나 만들기로 했습니다.

 

  factory KakaoUser.fromLocalJson(Map<String, dynamic> json) {
    return KakaoUser(
      id: json["id"],
      nickname: json["nickname"],
      profileImage: json["profileImage"],
      email: json["email"],
      connectedAt: json["connectedAt"],
    );
  }

KakaoUser.fromLocalJson()

 

이렇게 해두고, loadUser 쪽에  fromLocalJson을 하게 되면 이슈 없이 제대로 동작할 수 있습니다.