[Flutter] JsonSerializable-②RestaurantDetailModel에 JsonSerializable 적용하기

겨레·2024년 7월 18일
0

RestaurantDetailModel도 JsonSerializable 작업을 한 번 해보자!


① @JsonSerializable( ) 어노테이션 추가
② part 임포트하고 flutter pub run build_runner build

이전에 배운 대로 차근차근해봤다.




③ RestaurantDetailModel.fromJson 주석 처리
RestaurantDetailModel factory constructor 주석 처리해준다.



④ RestaurantDetailModel.fromJson 새롭게 작성
RestaurantDetailModel factory constructor을 새롭게 작성한다.


💣 트러블이슈

flutter pub run build_runner build
flutter pub run build_runner build watch를 해줬는데 .g.dart 폴더 생성이 안 됨!

☠️ RestaurantProductModel도 .fromJson을 해줘야 한다는 에러...

❓ 왜일까???
RestaurantDetailModel 안에 final List products; 이렇게
또 RestaurantProductModel이 있기 때문이다.

그럼 json으로 RestaurantDetailModel을 json으로부터 변경받을 때,
속성 중에 또 class가 있다면 그 속성도 json으로부터 값을 받아서
전환할 수 있는 기능이 필요하다.
즉, fromJson 메소드(constructor)가 필요하다는 것.

그런데 이 fromJson constructor를 JsonSerializable의 스탠다드에 맞게
설계하지 않으면 전환이 이뤄질 수 없음!


위 문제를 해결해보자!

⑤-1 lib/common/utils/data_utils.dart 폴더 및 파일 생성
restaurant_model.dart 코드의 class RestaurantModel 안에서만
아래 코드 기능을 사용하는 게 아니니까 따로 정리를 해두자!

 (
    fromJson: pathToUrl,
  ) 
static pathToUrl(String value) {
    return 'http://$ip$value';
  }


⑤-2 data_utils.dart 파일에 위 코드 빼기
이 class에 공통적으로 쓰는 static pathToUrl(String value) 메소드들을 다 정리하기!

⑤-3 restaurant_model.dart 파일 코드 수정
factory RestaurantModel.fromJson은 이제 더 이상 pathToUrl이 아니게 된다.

// 이제 이렇게 되는 거임!
(
    fromJson: DataUtils.pathToUrl,
  ) 


그러면 RestaurantDetailModel의 이미지 URL도 마찬가지겠지?

⑤-4 RestaurantProductMode 수정하기
이렇게 해주면 이젠 공통적으로 사용이 가능해짐!
리로드 해주면 restaurant_detail_model.g.dart 파일이 잘 만들어진 걸 볼 수 있다.


💣 그런데 이번엔 restaurant_detail_screen.dart 오류가 생긴다;;

❓ 이유는 constructor로 바꿨기 때문이다.

json을 지우고 저장을 다시 하면 오류가 사라지는 걸 볼 수 있다!


RestaurantProductModel에서도 @JsonSerializable( ) 어노테이션 달고,
factory RestaurantProductModel.fromJson 주석 처리하고 새로 만들어주는 거 잊지 말자!


(+) 그리고 이건 내 생각이었는데...

RestaurantDetailModel에도 @JsonKey( )를 해줘야 된다고 생각했다.
하지만, 수업 영상을 보니 하지 않더라...
RestaurantDetailModel에 imgUrl에만 하나 해줬다.
왜일까? 다음 수업 때 할까? 아니면 하지 않고 이게 끝일까?
흠... 약간 이해 안 되는 부분이다.

생각을 좀 해봤다.

RestaurantModel을 extends하기 때문인 것 같다...


RestaurantModel은 이미 thumbUrl에 @JsonKey( )가 된 상태고,
그 상태를 extends했으니까... 그런 게 아닐까?

profile
호떡 신문지에서 개발자로 환생

0개의 댓글