[Flutter] RestaurantDetailScreen-⑥Restaurant Detail Screen 모델링

겨레·2024년 7월 24일

스웨거 Restaurant Detail Model에는 기존 데이터에서 detail, products 2개의 파라미터가 추가되어 있는 걸 볼 수 있다.


① Restaurant Detail Model 만들기
restaurant/model/restaurant_detail_model.dart 파일을 먼저 만들어준다.

속성들은 레스토랑 model에서 일단 복붙해오자.
그리고 2개의 파라미터를 추가해준다.

그런데!!!! 이렇게 하면 문제가 생긴다.
바로 중복이 되버리는 것!

만약 Restaurant model의 속성들이 실제로 서버에서 바뀔 경우에는
model에서도 이 값들을 바꿔줘야 하고, Restaurant Detail Model 에서도
이 값들을 바꿔줘야 하는 문제가 생긴다.

이런 경우가 많아지면 많아질수록 중복으로 에디팅을 해줘야 하는 상황이 잦아지게 됨.

그래서 이렇게 하지 않고, Restaurant Model을 상속받아버린다.

이렇게 해버리면 더 이상 Restaurant Model에 있는 것들을 다시 선언할 필요가 없어진다.

이렇게 상속받았지만 추가된 2개의 파라미터는 존재하지 않음.
이 부분만 따로 추가로 선언해주자.



② products에 해당되는 모델 만들기
products는 리스트 안에 여러 개가 들어있음.
products에 해당되는 모델을 아래다가 만들어주자.

import 'package:flutter_actual/restaurant/model/restaurant_model.dart';

class RestaurantDetailModel extends RestaurantModel {
  final String detail; // detail
  final List<RestaurantProductModel> products;

  RestaurantDetailModel({
    required super.id,
    required super.name,
    required super.thumbUrl,
    required super.tags,
    required super.priceRange,
    required super.ratings,
    required super.ratingsCount,
    required super.deliveryFee,
    required super.deliveryTime,
    required this.detail,
    required this.products,
  });
}

class RestaurantProductModel {
  final String id;
  final String name;
  final String imgUrl;
  final String detail;
  final int price;

  RestaurantProductModel({
    required this.id,
    required this.name,
    required this.imgUrl,
    required this.detail,
    required this.price,
  });
}

그리고 RestaurantProductModel 이건 어떻게 쓸 수 있느냐...
위로 올라가서 코드 추가 작성


③ factory constructor 만들기
factory constructor를 만들었던 이유는?
json을 넣기만 하면 자동으로 매핑이 잘 되게 하려고!

그래서 직접 factory constructor를 만들어서 fron json이라는 네임드 컨스트럭터를 사용했음.

Restaurant Detail Model에도 factory constructor 만들어주자~
매핑을 할 거니까...


④ restaurant_detail_screen.dart 코드 수정
매핑이 잘 되는지 restaurant_detail_screen.dart에서 확인하기

아래 코드 추가

if (!snapshot.hasData) {
            return Container();
          }
          // data가 있으면 
          final item = RestaurantDetailModel.fromJson(json: snapshot.data);

근데 이렇게만 하면 snapshot.data에 에러가 날 수 있음.
Future 타입을 정해주지 않았기 때문...

<Map<String, dynamic>> 으로 타입 정해주고

.data를 반환해 준다.

그 아래 FutureBuilder도 <Map<String, dynamic>> 타입으로 정해준다.

builder: (, AsyncSnapshot snapshot)를
builder: (
, AsyncSnapshot<Map<String, dynamic>> snapshot) 이렇게 수정해 주고,

final item = RestaurantDetailModel.fromJson(json: snapshot.data);에서 data에 느낌표 찍어주기.
(data! => data는 무조건 존재한다)

저장하고 실행했더니 오류 발생!
원인은 매핑해 놓고 List로 반환해주지 않았기 때문!

.toList( )를 작성해 리스트로 변환되게 하고
이 Map이 RestaurantProductModel이라는 걸 보여주기 위해서
.map으로 작성해준다.



④ restaurant_detail_screen.dart 코드 수정

매핑해야 되는 것

1) renderTop의 RestaurantCard
RestaurantCard.fromModel( ~ 블러블러 )로 바꿔주기

그리고 드래그 된 구간은 삭제!

RestaurantDetailModel을 required하고 RestaurantDetailModel model을 받는다고 했을 때, RestaurantCard.fromModel 옆에 model 하고 그대로 model 넣어주면 됨!

그리고 올라가서 renderTop의 에다가 model을 받기로 했으니까 코드를 추가해 준다.

restaurant_detail_model.dart 코드에서 thumbUrl 매핑 해주는 것도 잊지말자!

그럼 아래처럼 다시 잘 나올 건데, 이미지 모서리가 깎여서 나와버린다.

그 이유는 restaurant_detail_screen.dart 코드 쪽에 renderTop에서
isDetail을 true로 바꾸지 않았기 때문에...
true로 바꿔주도록 하자.

그럼 다시 잘 나온다.



⑤ 상세 설명 나오게 하기

떡볶이에 설명이 나와야 하는데, 안 나오고 있다.
그 이유는???

from json constructor로 가보자...
(restaurant_card.dart 코드의 factory RestaurantCard.fromModel 부분)

보면 RestaurantCard는 detail이라는 파라미터를 받고 있음.
근데 아무 것도 넣고 있지 않음... 넣어주자!

이제 상세 설명이 나오는 걸 볼 수 있게 된다.


⑥ 로딩 구현
로딩하는 게 잘 안 보이는 문제가 있음
restaurant_detail_screen.dart에서 Container 수정해주기.

그러면 데이터 불러올 때 로딩 화면이 나옴

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

0개의 댓글