[Flutter] 데이터 모델링-②Factory 생성자와 fromJson 생성자 만들기

겨레·2024년 7월 15일
0

📍 factory

dart의 factory 키워드는 flutter에서 모델 클래스를 만들 때 자주 사용되는 예약어로 상속에서 많은 장점을 보임

이런 식으로 상속을 할 수 있음.

그런데 Factory Constructor는 어떻게 추가할 수 있을까?

📍 Factory Constructor 문법

// factory라고 해주고, 일반 Constructor 생성하듯 생성하면 됨
// 특이하게 일반 메소드(함수)처럼 { } 이렇게 바디가 있음!
// 여기에 꼭 해줘야하는 게 있음 => 현재 class의 인스턴스를 무조건 반환!
//
// 그리고 같은 이름의 Constructor는 생성할 수 없음! 
// 그래서 named constructor를 넣어줘야 함

그리고 특이하게 자식 클래스인 child를 반환해도 실행이 됨.
👉 Factory Constructor를 사용하면 현재 class의 인스턴스뿐만 아니라
현재 calss를 상속하고 있는 class도 인스턴스화 해서 반환
할 수 있다!
그래서 싱글턴 패턴을 많이 사용한다. 그게 아니더라도 데이터 모델링할 때도 유용하다.


본격적으로 Factory Constructor 사용해 불필요하게 작성된 코드를 반복적으로 작성하지 않아도 되게 모델링해보자!

① Factory Constructor 생성하기

이 부분이 인스턴스를 만드는 부분인데, Model 안에 넣어볼 거임!


  • restaurant_model.dart 코드

restaurant_model.dart로 가서 Factory Constructor를 넣어주자!
이때 json으로부터 data를 가져온다는 의미로 .fromJson이라고 네임드 Constructor를 만들어 줄거임.

그리고 ({ }) 여기 안에 파라미터를 어떻게 받아오냐면...
json이라는 이름으로 일단 받아올거임.

그리고 json의 경우엔 Map<String, dynamic>으로 표현!
다트에서는 API를 통해 json 값을 가져와서 그 값을 넣을 땐 Lsit가 아닌 이상 무조건 Map<String, dynamic>json



  • restaurant_screen.dart 코드

이렇게 Map<String, dynamic>이라는 json 값을 받아오면...
그 값은 RestaurantModel을 .fromJson에 넣었을 때 snapshot.data의 index가 특정 아이템 값들을 내부에서 받을 수 있음!

그게 어디냐면 restaurant_model.dart에 있는 required Map<String, dynamic>json의 json 여기!!!



② 해당 class의 인스턴스 반환하기

이 값들을 모두 다 넣어줘야 RestaurantModel을 만들 수 있음.
왜냐면, 기본 cunstructor에 선언해뒀기 때문...

RestaurantModel({
    required this.id,
    required this.name,
    required this.thumbUrl,
    required this.tags,
    required this.priceRange,
    required this.ratings,
    required this.ratingsCount,
    required this.deliveryFee,
    required this.deliveryTime,
  });

그럼 id, name ~ deliveryTime은 어디서 가져올 수 있을까?


restaurant_screen.dart에서 이거를 그대로 가져오면 된다.

item은 현재 에러...
왜냐면 item이란 변수가 존재하지 않기 때문!
그런데 item이란 변수를 json이라고 선언해두었음.

결국 final pItem에서의 item과
final pItem2 = RestaurantModel.fromJson(json: item);에서의
json은 같은 값!

원래 선언할 때 기본 cuntructor에 써서 인스턴스화를 했을 땐,
직접 네임드 파라미터를 매핑해줘야 했음.

그런데 아이템을 통째로 넣어주고, 매핑해 주는 과정을
fromJson cuntructor에 정의함!


③ pItem 지우기
pItem 코드 지우고 final pItem2를 pItem으로 수정



이렇게 해도 여전히 데이터가 잘 들어오는 걸 확인할 수 있다.

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

0개의 댓글