본문으로 바로가기
  1. Home
  2. Flutter/Package
  3. Flutter Riverpod 상태관리 (4) - Code generation 대해

Flutter Riverpod 상태관리 (4) - Code generation 대해

· 댓글개 · Dev_Whale

코드 생성(Code generation)은 도구를 사용하여 코드를 생성하는 개념입니다. Dart에서는 애플리케이션을 '컴파일'하기 위해 추가 단계가 필요하다는 단점이 있습니다. 이 문제는 가까운 시일 내에 해결될 수 있지만, Dart 팀에서 이 문제에 대한 잠재적인 해결책을 연구 중이므로 조만간 해결될 수 있습니다.

 

Riverpod의 맥락에서 코드 생성은 ‘provider'를 정의하는 구문을 약간 변경하는 것입니다. 예를 들어 :

final fetchUserProvider = FutureProvider.autoDispose.family<User, int>((ref, userId) async {
  final json = await http.get('api/user/$userId');
  return User.fromJson(json);
});

코드 생성을 사용하여 코드를 작성합니다:

@riverpod
Future<User> fetchUser(FetchUserRef ref, {required int userId}) async {
  final json = await http.get('api/user/$userId');
  return User.fromJson(json);
}

Riverpod를 사용할 때 코드 생성은 전적으로 선택 사항입니다. 코드 생성을 하지 않고도 Riverpod를 사용할 수 있습니다. 동시에 Riverpod는 코드 생성을 허용하며 사용을 권장합니다.

 

Riverpod의 코드 생성기를 설치하고 사용하는 방법에 대한 자세한 내용은 시작하기 페이지를 참조하세요. 문서의 사이드바에서 코드 생성 기능을 활성화해야 합니다.

 

Riverpod에서 코드 생성을 사용하는 이유는 무엇일까요?

궁금하실 수도 있습니다: "'Riverpod'에서 코드 생성은 선택 사항인데 왜 사용해야 하나요?"

 

패키지는 언제나 그렇듯: 여러분의 삶을 더 편하게 만들어 드립니다. 여기에는 다음이 포함되지만 이에 제한되지는 않습니다:

  • 더 나은 구문, 가독성/유연성, 학습 곡선 감소
    • FutureProvider vs Provider vs 등… 에 대해 걱정할 필요가 없습니다. 로직을 작성하면 Riverpod에서 가장 적합한 Provider를 선택합니다.
    • 이제 provider에게 매개변수를 전달하는 데 제한이 없습니다. 이제 Family를 사용하여 단일 위치 매개변수(Single positional parameter)를 전달하는 것으로 제한되지 않고 모든 형태의 매개변수를 전달할 수 있습니다. 여기에는 명명된 매개변수, 선택적 매개변수, 심지어 기본값도 포함됩니다.
  • Riverpod에서 작성된 코드의 상태 hot-reload stateful
  • 디버거가 추가 메타데이터를 생성하여 디버깅을 개선할 수 있습니다.
  • 일부 Riverpod 기능은 코드 생성을 통해서만 사용할 수 있습니다.

동시에, 많은 애플리케이션이 이미 Freezed 또는 json_serializable과 같은 패키지로 코드 생성을 사용하고 있습니다. 이 경우 프로젝트는 이미 코드 생성을 위한 설정이 되어 있을 것이며, Riverpod를 사용하는 것은 간단할 것입니다.

구문 (Syntax)

Provider 정의하기

코드 생성을 사용하여 provider를 정의할 때는 다음 사항을 염두에 두는 것이 좋습니다:

  • Provider는 주석 처리된 함수 또는 주석 처리된 클래스로 정의할 수 있습니다. 둘은 거의 동일하지만 클래스 기반 Provider는 외부 객체가 Provider의 상태를 수정할 수 있는 public 메서드를 포함할 수 있다는 장점이 있습니다('사이드 이펙트'). 함수형 provider는 build method만 있는 Class based provider를 작성하기 위한 문법의 일부이므로 UI에서 수정할 수 없습니다.
  • 모든 Dart 비동기 기본 요소(Future, FutureOr, Stream)가 지원됩니다.
  • 함수가 비동기로 표시되면 Provider는 오류/로딩 상태를 자동으로 처리하고 AsyncValue를 노출합니다.

Making a provider autoDispose/keepAlive:

코드 생성을 사용하여 생성된 Provider는 기본적으로 autoDispose이므로 연결된 리스너가 없을 때 (ref.watch/ref.listen) 자동으로 폐기됩니다.

이 기본 설정은 Riverpod의 방향성에 더 잘 부합합니다. 코드 생성이 없는 변형의 초기에는 패키지: provider에서 마이그레이션하는 사용자를 수용하기 위해 autoDispose가 기본적으로 꺼져 있었습니다.

// AutoDispose provider (keepAlive is false by default)
@riverpod
String example1(Example1Ref ref) => 'foo';

// Non autoDispose provider
@Riverpod(keepAlive: true)
String example2(Example2Ref ref) => 'foo';

코드가 생성되지 않은 방식으로부터 마이그레이션하기

코드 생성이 되지 않는 형태를 사용할 때는 provider 타입을 수동으로 결정해야 합니다. 다음은 코드 생성 방식 전환을 위한 해당 옵션입니다:

이러한 provider는 모든 provider에서 자세히 살펴볼 수 있습니다.

💬 댓글 개
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.