flutter

Flutter Retrofit 을 사용한 API 호출 및 freezed 사용

bakerlee 2022. 12. 1. 20:35

freezed 를 사용한 Data 클랫스 생성 및 사용 

flutter에서 DTO를 생성해 보도록 한다. 

https://pub.dev/packages/freezed

 

freezed | Dart Package

Code generation for immutable classes that has a simple syntax/API without compromising on the features.

pub.dev

우선 의존성을 추가 해야한다. 의존성은 아래의 retrofit까지 같이 추가되어있다. 

dependencies:
  retrofit: 
  dio:
  # DTO 클래스 사용을 위해
  freezed_annotation:
  json_annotation:
  
  
dev_dependencies:
  retrofit_generator:
  build_runner: 
  json_serializable:
  # DTO 사용을 위한 
  freezed:

 

 

보통 DTO 클래스들은 단순한 데이터 저장 및 호출 이외에도 여러 기능들이 필요하다. 

toString ,json 변환부터 비교, 인스턴스 생성 등 경우에 따라 상당히 많은 기능들이 필요한 경우가 있다.  

spring의 lombok, kotlin의 data class 등이 유사한 사례이다. 

 

아래와 같이 코드를 작성하도록 한다.

import 'package:freezed_annotation/freezed_annotation.dart';

/// date : "2022-01-01"
/// dateName : "1월1일"
/// dateKind : "국경일"
/// isHoliday : true
// 아래의 두 라인을 추가 해 주어야 한다. 
// '파일명.g.dart', '파일명.freezed.dart'
part 'holiday.freezed.dart';
part 'holiday.g.dart';

@freezed
class Holiday with _$Holiday {
  factory Holiday(
      {required String date,
      required String dateName,
      required String dateKind,
      required bool isHoliday}) = _Holiday;

  factory Holiday.fromJson(Map<String, dynamic> json) =>
      _$HolidayFromJson(json);
}

위의 코드를 작성한 뒤 terminal에  flutter pub run build_runner build  를 입력하면 

동일한디렉토리에 part에 입력한 파일들이 자동 생성된다. 

 

Retrofit 을 사용하여 API 호출 받기

Flutter 에서 Retrofit을 사용해 보도록 한다. 

https://pub.dev/packages/retrofit

 

retrofit | Dart Package

retrofit.dart is an dio client generator using source_gen and inspired by Chopper and Retrofit.

pub.dev

 

 

android 개발자라면 익숙한 그 이름이다. 역시나 같은 기능을 수행한다. 

 

사용을 위해선 다음과 같은 설정이 필요하다. 

공식문서 상에는 dio 의존성이 없지만 예제실행을 위해서는 dio를 별도로 추가 해 주어야 한다. 

 

 

 

실사용 

 

레트로핏은 factory 생성자와 build_runner를 사용한 코드 생성방식을 사용한다.

형식에 맞는 코드를 작성한 뒤 

terminal에  flutter pub run build_runner build  을 실행시키면 파일 및 코드를 생성하여 추가시켜준다. 

 

import 'package:dio/dio.dart';
import 'package:holiday/model/holiday/holiday.dart';
import 'package:retrofit/http.dart';

// '파일명.g.dart'
part 'rest_client.g.dart';

@RestApi(baseUrl: "url")
abstract class RestClient {
  factory RestClient(Dio dio, {String baseUrl}) = _RestClient;

  @POST('/path')
  Future<List<Holiday>> getHolidayList();
  
  @GET('/path')
  Future<List<Holiday>> getHoliday();
}

역시나 part에서 추가한 파일이 자동 생성된다. 

 

flutter/dart에서는 코드 자동생성을 자주 사용하는 듯 하다. 

 

 

* 주의점 

build_runner는 직접 실행을 하는 명령어이며 실행 시점의 정보를 가지고 코드를 생성한다. 

따라서 코드를 수정하였다면 build_runner를 반드시 다시 실행해 주어야 한다.  

코드를 수정하여도 build_runner를 다시 실행하지 않는다면 이전 버전의 코드가 그대로 실행된다. 

 

 

https://blog.codefactory.ai/flutter/freezed/

 

[Flutter] Flutter Freezed 플러그인! Entity Code Generation 은 이거 하나로 끝

서론 Flutter 는 Code Generation 기능이 상당히 많이 활성화되어 있어요. 흔히들 많이 사용하는 json_serializable 라이브러리도 있고 retrofit 및 chopper 라이브러리도 있습니다. 오늘 알려드릴 freezed…

blog.codefactory.ai

 

'flutter' 카테고리의 다른 글

Flutter Hive 사용하기 (+Freezed)  (0) 2023.01.09
flutter extention 활용  (0) 2022.12.20
[FLUTTER] HTTP 를 사용한 데이터 받아오기  (0) 2022.02.19
[Flutter] Route를 활용한 화면 전환  (0) 2021.11.27
[Flutter] Scafford?..  (0) 2021.08.14