seong

Provider - LessonDetail 더미데이터로 Store값 가져와서 테스트 본문

Flutter/중계 플랫폼 프로젝트

Provider - LessonDetail 더미데이터로 Store값 가져와서 테스트

hyeonseong 2022. 12. 7. 12:30

LessonDetail 작성

Lesson을 만들었지만 Dto를 쓴다 

엔티티는 리턴 하지 않는다. 페이지 별로 데이터가 각각 다르고 언제든지 변해도 상관 없게 하기 위해 Dto를 쓴다

import 'dart:ffi';

import 'review_resp_dto.dart';

class LessonRespDto {
  String lessonName;
  Int lessonPrice;
  Int lessonTime;
  Int lessonCount;
  String lessonPlace;
  String possibleDays;
  String lessonPolicy;
  String masterName;
  String masterImg;
  String masterIntroduction;
  List<ReviewRespDto> lessonReviewList;

  LessonRespDto(
      {required this.lessonName,
      required this.lessonPrice,
      required this.lessonTime,
      required this.lessonCount,
      required this.lessonPlace,
      required this.possibleDays,
      required this.lessonPolicy,
      required this.masterName,
      required this.masterImg,
      required this.masterIntroduction,
      required this.lessonReviewList});

  factory LessonRespDto.fromJson(Map<String, dynamic> json) => LessonRespDto(
        lessonName: json["lessonName"],
        lessonPrice: json["lessonPrice"],
        lessonTime: json["lessonTime"],
        lessonCount: json["lessonCount"],
        lessonPlace: json["lessonPlace"],
        possibleDays: json["possibleDays"],
        lessonPolicy: json["lessonPolicy"],
        masterName: json["masterName"],
        masterImg: json["masterImg"],
        masterIntroduction: json["masterIntroduction"],
        //Nested Structure이기 때문에 한번에 map처리 null이 아니면 fromjson을 실행.
        lessonReviewList: (json["lessonReviewList"]).map((e) => e == null ? null : ReviewRespDto.fromJson(e).toJson()),
      );
  Map<String, dynamic> toJson() => {
        "lessonName": lessonName,
        "lessonPrice": lessonPrice,
        "lessonTime": lessonTime,
        "lessonCount": lessonCount,
        "lessonPlace": lessonPlace,
        "possibleDays": possibleDays,
        "lessonPolicy": lessonPolicy,
        "masterName": masterName,
        "masterImg": masterImg,
        "masterIntroduction": masterIntroduction,
        //Nested Structure이기 때문에 한번에 map처리
        "lessonReviewList": lessonReviewList.map((e) => e.toJson()).toList(),
      };
}

lessonHttpRepository

Detail은 id값이 필요하다. 매개 변수로 id값을 할당 해주었다. 

await로 DB에 연결을 요청 해두고 , Future로 null박스를 우선 리턴 해두었다가 데이터가 응답이 오게 되면 돌아와서

lessonRespDto를 받아서 리턴해준다.

import 'dart:convert';
import 'dart:html';

import 'package:finalproject_front/domain/http_connector.dart';
import 'package:finalproject_front/dto/response/lesson_resp_dto.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:http/http.dart';

final lessonHttprepository = Provider<LessonHttpRepository>((ref) {
  return LessonHttpRepository(ref);
});

class LessonHttpRepository {
  Ref _ref;
  LessonHttpRepository(this._ref);

  Future<LessonRespDto> getLessonDetail(int id) async {
    Response response = await _ref.read(httpConnector).get("/api/lesson/${id}");
    LessonRespDto lessonRespDto = LessonRespDto.fromJson(jsonDecode(response.body));
    return lessonRespDto;
  }
}

 

lessonDetailPageStore

Detail은 하나의 오브젝트만 보여주면 된다. 

팀원중 한명이 더미데이터를 만들어 주고있다, 그전에 미리 테스트를 해보기 위해 중간에 만들어진 더미 한개만 넘겨 받아서 테스트를 해보았다.

백엔드가 완성 전까지 더미데이터가 필요하기 때문에 테스트는 한개만 진행하고 나도 더미데이터로 붙어야겠다.

import 'package:finalproject_front/domain/lesson/lesson_http_repository.dart';
import 'package:finalproject_front/dto/response/lesson_resp_dto.dart';
import 'package:finalproject_front/dto/response/review_resp_dto.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final lessonDetailPageStore = StateNotifierProvider<LessonDetailPageStore, LessonRespDto>((ref) {
  LessonRespDto lesson = LessonRespDto(
      lessonName: "내 몸 상태 바로 알기 내몸에 꼭맞는 운동 테스트",
      lessonPrice: 50000,
      lessonTime: 110,
      lessonCount: 13,
      lessonPlace: "부산관역시 부산진구 홍길동",
      possibleDays: "월요일",
      lessonPolicy: "취소 및 환불을 하면 솰라솰라 10회 피티 이용제한이 생기면서 한국 중국 러시아 일본 베트남 말레시아 영국 미국 북한 필리핀 브라질",
      masterImg: "https://picsum.photos/200",
      masterName: "김동진",
      masterIntroduction: "한국대학교 경호학과 졸업, 다수 대회에서 수상경력 있습니다.",
      lessonReviewList:
          List<ReviewRespDto>.generate(5, (index) => ReviewRespDto(username: "아이유", reviewContent: "ㅎㅇ", lessonGrade: 4.5), growable: true));
  return LessonDetailPageStore(lesson, ref);
});

class LessonDetailPageStore extends StateNotifier<LessonRespDto> {
  Ref _ref;
  LessonDetailPageStore(super.state, this._ref);

  void initViewModel() async {}
}

 

controller는 현재 테스트에선 사용하지 않았다.

애초에 테스트에서 DB까지 연결을 하지 않기 때문에 Store <-> Page간에 실행 되는지만 확인을 했다.

그래도 우선 만들었다.

import 'package:finalproject_front/domain/lesson/lesson_http_repository.dart';
import 'package:finalproject_front/dto/response/lesson_resp_dto.dart';
import 'package:finalproject_front/main.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';

final lessonController = Provider<LessonController>(((ref) {
  final LessonHttpRepositoryPS = ref.read(lessonHttprepository); // Controller + HttpRepo
  return LessonController(ref);
}));

class LessonController {
  final context = navigatorKey.currentContext!;

  Ref _ref;

  LessonController(this._ref);

// 절대 리턴 하지 말기
  void getLessonDetail(int id) async {
    LessonRespDto lessonPS = await _ref.read(lessonHttprepository).getLessonDetail(id); // 가져온 값을 lessonRespDto에 저장
  }
}