Freezed를 사용하여 데이터 클래스 만들기

14400 단어 Dartfreezedtech

이른바 Freezed


Freezed는 Dart 언어로 데이터 클래스를 생성할 수 있는 프로그램 라이브러리입니다.
  • 기술구조기는 속성도 자동으로 정의된다
  • 객체의 모든 속성을 개별적으로 비교/표시할 수 있음==toString
  • 값이 다른 객체를 복제할 수 있음CopyWith
  • 객체의 신뢰성 허용ToJsonFromJson
  • 또한 Union 및 Sealed Class도 지원됩니다.
    자세한 내용은 공식 문서에 기재되어 있으니 확인해 주십시오.

    컨디션


    본 글은 다음과 같은 환경에서 동작 확인을 진행하였다.
  • OS : macOS Monterey 12.0.1
  • Dart : v2.5.3
  • IDE : VS Code
  • 설정


    Build Runner


    Freezed에서 Build Runner 라이브러리를 사용하여 코드를 생성합니다.VScode에서 Build Runner를 쉽게 조작할 수 있도록 확장 기능을 미리 설치합니다.
    Image.png

    Freezed


    Freezed를 사용하여 데이터 클래스를 만들 때는 Freezed 레코드 클래스를 사용해야 합니다.VScode는 이러한 범주를 설명하는 확장 기능을 자동으로 생성하기 때문에 설치합니다.
    Image.png
    인텔리제이와 안드로이드 스튜디오의 경우 프리즈드용 라이브 템플렉스를 준비한 것 같다.IntelliJ 및 Android Studio를 사용할 때는 여기.를 설치하는 것이 좋습니다.

    종속성 추가


    Freezedpubspec.yaml를 사용하기 위해 다음과 같은 의존 관계를 추가합니다.
    name: sample
    description: A simple command-line application.
    version: 1.0.0
    # homepage: https://www.example.com
    
    environment:
      sdk: '>=2.14.4 <3.0.0'
    
    
    dependencies:
      freezed_annotation: ^1.0.0 # これを追加する
      json_serializable: ^6.0.1 # 必要であれば追加する
    
    dev_dependencies:
      lints: ^1.0.0
      build_runner: ^2.1.5 # これを追加する
      freezed: ^1.0.0 # これを追加する
    

    데이터 클래스 만들기


    데이터 클래스의 초기 형태 만들기


    명령 트레이에서 Freezed:Generate a new Freezed class 메뉴를 선택합니다.
    Image.png
    다음 생성할 클래스 이름을 입력하십시오.
    이번에는'애니멀'이라는 반을 만들어 보려고 한다.
    Image.png
    이어 toJson과 fromJson을 지원할지 여부를 결정한다.
    이번에는 toJson과 fromJson을'No'로 지지하지 않으려고 한다.
    Image.png
    그리고 마지막으로 파일의 출력 위치를 결정합니다.
    이번에는 Dart 프로젝트의 bin 폴더로 출력해 봅시다.
    (가끔 오류 대화 상자가 나타나지만 문제가 없습니다.)
    Image.png

    데이터 클래스의 초기 형태 편집

    bin 폴더에서 다음과 같은 내용을 생성하는 Animal 클래스.
    이때는 오류가 있었지만 나중에 없앨 수 있어 문제없다.
    import 'package:freezed_annotation/freezed_annotation.dart';
    
    part 'animal.freezed.dart';
    part 'animal.g.dart';
    
    
    class Animal with _$Animal {
      factory Animal() = _Animal;
    	
      factory Animal.fromJson(Map<String, dynamic> json) =>
    			_$AnimalFromJson(json);
    }
    
    Animal류에 필요한 속성을 정의합니다.
    이번에는 Animal반에 추가nameage를 시도해 보자.
    import 'package:freezed_annotation/freezed_annotation.dart';
    
    part 'animal.freezed.dart';
    part 'animal.g.dart';
    
    
    class Animal with _$Animal {
      factory Animal({String? name, int? age}) = _Animal;
    }
    
    명령 트레이에서 Build Runner: Build 메뉴를 선택합니다.
    그래서 애니매al.freezed.데이터 클래스의 생성이 완료되었습니다.
    Image.png

    동작 확인


    이번에 toJsonfromJson의 설치를 생략하였으며, 아래 3가지 기능을 사용할 수 있다.
  • 기술구조기는 속성도 자동으로 정의된다
  • 객체의 모든 속성을 개별적으로 비교/표시할 수 있음==toString
  • 값이 다른 객체를 복제할 수 있음CopyWith
  • 다음 코드를 사용하여 실제 생성된 Animal류를 확인합니다.
    출력 결과를 똑똑히 보기 위해 각 기능은 문제없이 작동하고 있다.

    샘플 코드


    void main(List<String> arguments) {
      var yagi = Animal(name: "Yagi", age: 0);
      print("■ PROPERTY AND TOSTRING");
      print("name ${yagi.name}");
      print("age  ${yagi.age}");
      print("toString $yagi");
    
      var ushi = Animal(name: "Ushi", age: 0);
      var clone = yagi.copyWith();
      print("■ COMPARE");
      print("== ${yagi == ushi}");
      print("== ${yagi == clone}");
    
      var renameYagi = yagi.copyWith(name: "ああああ");
      var oldYagi = yagi.copyWith(age: 100);
      print("■ COPY WITH");
      print("toString $renameYagi");
      print("toString $oldYagi");
    }
    

    결과 내보내기


    ■ PROPERTY AND TOSTRING
    name Yagi
    age  0
    toString Animal(name: Yagi, age: 0)
    ■ COMPARE
    == false
    == true
    ■ COPY WITH
    toString Animal(name: ああああ, age: 0)
    toString Animal(name: Yagi, age: 100)
    

    참고 문헌

  • Github | Freezed
  • 본 글의 동작을 확인할 때 사용하는 코드
  • 좋은 웹페이지 즐겨찾기