From d0fb9be59612f5ad5eecb3d95ead981f15ba33c1 Mon Sep 17 00:00:00 2001 From: MinByeongDon Date: Thu, 9 May 2024 03:48:39 +0900 Subject: [PATCH] Change the translated [KO] docs to be clearer. (#3530) --- .../current/advanced/select.mdx | 4 +- .../current/case_studies/cancel.mdx | 26 ++++----- .../case_studies/cancel/extension.dart | 31 ----------- .../case_studies/cancel/home_screen.dart | 39 -------------- .../current/case_studies/pull_to_refresh.mdx | 8 +-- .../concepts/about_code_generation.mdx | 1 - .../current/essentials/auto_dispose.mdx | 16 +++--- .../current/essentials/combining_requests.mdx | 8 +-- .../current/essentials/do_dont.mdx | 6 +-- .../essentials/eager_initialization.mdx | 12 ++--- .../current/essentials/faq.mdx | 4 +- .../current/essentials/first_request.mdx | 54 +++++++++---------- .../current/essentials/passing_args.mdx | 12 ++--- .../current/essentials/side_effects.mdx | 2 +- .../current/essentials/testing.mdx | 18 +++---- .../current/essentials/websockets_sync.mdx | 8 +-- .../current/from_provider/helpers/item.dart | 12 ----- .../current/from_provider/helpers/json.dart | 1 - .../from_provider/motivation/motivation.mdx | 8 +-- .../from_provider/provider_vs_riverpod.mdx | 14 ++--- .../current/from_provider/quickstart.mdx | 28 ++++++---- .../current/introduction/getting_started.mdx | 35 ++++++------ .../getting_started/dart_pub_add.tsx | 32 ----------- .../getting_started/dart_pubspec.tsx | 40 -------------- .../introduction/getting_started/pub_add.tsx | 39 -------------- .../introduction/getting_started/pubspec.tsx | 51 ------------------ .../current/introduction/why_riverpod.mdx | 7 ++- .../current/migration/0.13.0_to_0.14.0.mdx | 4 +- .../current/migration/0.14.0_to_1.0.0.mdx | 4 +- .../current/migration/from_state_notifier.mdx | 2 +- website/src/documents_meta.js | 2 +- 31 files changed, 143 insertions(+), 385 deletions(-) delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/cancel/extension.dart delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/cancel/home_screen.dart delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/item.dart delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/json.dart delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started/dart_pub_add.tsx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started/dart_pubspec.tsx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started/pub_add.tsx delete mode 100644 website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started/pubspec.tsx diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/advanced/select.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/advanced/select.mdx index e71160726..a7bd985e5 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/advanced/select.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/advanced/select.mdx @@ -56,10 +56,10 @@ import selectAsync from "/docs/advanced/select/select_async"; 다른 provider를 수신하는 provider를 최적화하려는 경우 다른 provider가 비동기식일 가능성이 있습니다. 일반적으로는 `ref.watch(anotherProvider.future)`를 사용해 값을 가져옵니다. -문제는 `select`이 `AsyncValue`에 적용된다는 것인데, 이는 기다릴 수 있는(await) 상황이 아닙니다. +이슈는 `select`가 기다릴수(await) 없는 `AsyncValue`에 적용된다는 것입니다. 이를 위해 `selectAsync`를 대신 사용할 수 있습니다. -이 함수는 비동기 코드에 고유하며, 공급자가 방출한 데이터에 대해 `select` 연산을 수행할 수 있게 해줍니다. +이 함수는 비동기 코드에 고유하며, provider가 내보낸 데이터에 대해 `select` 연산을 수행할 수 있습니다. 사용법은 `select`와 비슷하지만 대신 `Future`를 반환합니다: 먼저, 디바운스나 취소 없이 애플리케이션을 만들어 봅시다. @@ -75,7 +75,7 @@ Riverpod에서는 이 두 가지 기술을 비슷한 방식으로 구현할 수 이제 애플리케이션이 작동하므로 취소(cancellation) 로직을 구현해 보겠습니다. 이를 위해 사용자가 페이지에서 다른 곳으로 이동할 때 `ref.onDispose`를 사용하여 요청을 취소할 것입니다. -이 기능이 작동하려면 provider의 자동 폐기(automatic disposal)가 활성화되어 있어야 합니다. +이 기능이 작동하려면 providers의 자동 폐기(automatic disposal)가 활성화되어 있어야 합니다. 요청을 취소하는 데 필요한 정확한 코드는 HTTP 클라이언트에 따라 다릅니다. 이 예에서는 `package:http`를 사용하지만 다른 클라이언트에도 동일한 원칙이 적용됩니다. @@ -112,17 +112,17 @@ Riverpod에서는 이 두 가지 기술을 비슷한 방식으로 구현할 수 그런 다음 사용자가 500ms가 경과하기 전에 활동을 다시 새로고침하면 `onDispose`가 호출되어 요청이 중단됩니다. :::info -요청을 중단하려면 자발적으로 던지는(throw) 것이 일반적입니다. -provider가 폐기된(disposed) 후에는 공급자 내부에 던지는(throw) 것이 안전합니다. +요청을 중단하려면, 자발적(voluntarily)으로 던지는(throw) 것이 일반적입니다. +provider가 폐기된(disposed) 후에는 providers 내부에 던져도(throw) 안전합니다. 예외는 당연히 Riverpod에 의해 잡히고 무시됩니다. ::: @@ -139,16 +139,16 @@ provider가 폐기된(disposed) 후에는 공급자 내부에 던지는(throw) -그런 다음 다음과 같이 공급자에서 이 확장 메서드를 사용할 수 있습니다: +그런 다음 다음과 같이 providers에서 이 확장 메서드를 사용할 수 있습니다: getDebouncedHttpClient([Duration? duration]) async { - // 먼저 디바운싱을 처리합니다. - var didDispose = false; - onDispose(() => didDispose = true); - - // 사용자가 새로 고침을 중단할 때까지 기다리기 위해 요청을 500밀리초 지연합니다. - await Future.delayed(duration ?? const Duration(milliseconds: 500)); - - // 지연 중에 provider가 폐기(disposed)되었다면 사용자가 다시 새로고침했다는 의미입니다. - // 예외를 던져 요청을 취소합니다. - // 리버포드에 의해 포착되므로 여기서 예외를 사용하는 것이 안전합니다. - if (didDispose) { - throw Exception('Cancelled'); - } - - // 이제 클라이언트를 생성하고 provider가 폐기되면 클라이언트를 닫습니다. - final client = http.Client(); - onDispose(client.close); - - // 마지막으로 클라이언트를 반환하여 provider가 요청을 할 수 있도록 합니다. - return client; - } -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/cancel/home_screen.dart b/website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/cancel/home_screen.dart deleted file mode 100644 index 28f0c50cf..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/cancel/home_screen.dart +++ /dev/null @@ -1,39 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; - -import 'detail_screen/codegen.dart'; - -/* SNIPPET START */ -void main() => runApp(const ProviderScope(child: MyApp())); - -class MyApp extends StatelessWidget { - const MyApp({super.key}); - - @override - Widget build(BuildContext context) { - return MaterialApp( - routes: { - '/detail-page': (_) => const DetailPageView(), - }, - home: const ActivityView(), - ); - } -} - -class ActivityView extends ConsumerWidget { - const ActivityView({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Scaffold( - appBar: AppBar(title: const Text('Home screen')), - body: const Center( - child: Text('Click the button to open the detail page'), - ), - floatingActionButton: FloatingActionButton( - onPressed: () => Navigator.of(context).pushNamed('/detail-page'), - child: const Icon(Icons.add), - ), - ); - } -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/pull_to_refresh.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/pull_to_refresh.mdx index 1910ffaeb..8de005d8e 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/pull_to_refresh.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/case_studies/pull_to_refresh.mdx @@ -87,13 +87,13 @@ Freezed/json_serializable을 반드시 사용해야 하는 것은 아니지만 사용자가 화면을 아래로 내리면 `RefreshIndicator`가 `onRefresh` 콜백을 호출합니다. 이 콜백을 사용해 데이터를 새로 고칠 수 있습니다. -여기서 `ref.refresh`를 사용하여 선택한 공급자를 새로 고칠 수 있습니다. +여기서 `ref.refresh`를 사용하여 선택한 provider를 새로 고칠 수 있습니다. **참고**: `onRefresh`는 `Future`를 반환할 것으로 예상됩니다. 그리고 새로 고침이 완료될 때 그 future가 완료되는 것이 중요합니다. -이러한 future를 얻으려면 공급자의 '.future' 속성을 읽으면 됩니다. -그러면 공급자가 해결(resolved)될 때 완료되는 future가 반환됩니다. +이러한 future를 얻으려면 provider의 '.future' 속성을 읽으면 됩니다. +그러면 provider가 해결(resolved)될 때 완료되는 future가 반환됩니다. 따라서 `RefreshIndicator`를 다음과 같이 업데이트할 수 있습니다: @@ -114,7 +114,7 @@ Freezed/json_serializable을 반드시 사용해야 하는 것은 아니지만 - 초기 로드 중에는 전체 화면 스피너를 표시하고 싶습니다. - 새로 고침 중에는 새로 고침 표시기와 이전 데이터/오류를 표시하고 싶습니다. -다행히도 Riverpod에서 비동기 프로바이더를 수신할 때, Riverpod는 필요한 모든 것을 제공하는 `AsyncValue`를 제공합니다. +다행히도 Riverpod에서 비동기 provider를 수신할 때, Riverpod는 필요한 모든 것을 제공하는 `AsyncValue`를 제공합니다. 이 `AsyncValue`는 다음과 같이 Dart 3.0의 패턴 일치(pattern matching)와 사용할 수 있습니다: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/concepts/about_code_generation.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/concepts/about_code_generation.mdx index 4882f21bb..8e4b03ceb 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/concepts/about_code_generation.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/concepts/about_code_generation.mdx @@ -187,7 +187,6 @@ Riverpod의 코드 생성을 사용하려면, :::caution `ref.onDispose`의 콜백은 부작용을 유발하지 않아야 합니다. -`onDispose` 내에서 프로바이더를 수정하면 예기치 않은 동작이 발생할 수 있습니다. +`onDispose` 내에서 providers를 수정하면 예기치 않은 동작이 발생할 수 있습니다. ::: :::info @@ -123,7 +123,7 @@ provider의 Disposable 객체당 한 번씩 호출해도 됩니다. @@ -139,7 +139,7 @@ provider가 `ref.invalidateSelf`를 사용하여 스스로 무효화할 수 있 @@ -158,7 +158,7 @@ provider가 `ref.invalidateSelf`를 사용하여 스스로 무효화할 수 있 @@ -180,10 +180,10 @@ provider가 다시 계산되면 자동 폐기가 다시 활성화됩니다. @@ -197,4 +197,4 @@ provider가 다시 계산되면 자동 폐기가 다시 활성화됩니다. /> 이 로직은 필요에 맞게 조정할 수 있습니다. -예를 들어 `ref.onCancel`/`ref.onResume`을 사용하여 특정 시간 동안 공급자가 수신 대기하지 않은 경우에만 상태를 삭제할 수 있습니다. +예를 들어 `ref.onCancel`/`ref.onResume`을 사용하여 특정 시간 동안 provider가 수신 대기하지 않은 경우에만 상태를 삭제할 수 있습니다. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/combining_requests.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/combining_requests.mdx index 5fc228acb..2c60ace20 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/combining_requests.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/combining_requests.mdx @@ -42,7 +42,7 @@ import readExample from '/docs/essentials/combining_requests/read_example' @@ -51,7 +51,7 @@ import readExample from '/docs/essentials/combining_requests/read_example' @@ -79,7 +79,7 @@ import readExample from '/docs/essentials/combining_requests/read_example' {...watchExample} translations={{ provider: " // TO-DO: 현재 위치를 가져오는 스트림을 반환합니다.", - watch: " // \"ref.watch\"를 사용하여 최신 위치를 가져옵니다.\n // 공급자 뒤에 \".future\"를 지정하면 코드가 적어도 하나의 위치를 사용할 수 있을 때까지 기다립니다.", + watch: " // \"ref.watch\"를 사용하여 최신 위치를 가져옵니다.\n // provider 뒤에 \".future\"를 지정하면 코드가 적어도 하나의 위치를 사용할 수 있을 때까지 기다립니다.", get: " // 이제 해당 위치를 기반으로 네트워크 요청을 할 수 있습니다.\n // 예를 들어 Google 지도 API를 사용할 수 있습니다:", jsonDecode: " // JSON에서 레스토랑 이름 가져오기", }} @@ -141,7 +141,7 @@ provider가 어떻게든 다시 계산되면 이전 리스너가 제거됩니다 마지막으로 사용할 수 있는 옵션은 `ref.read`입니다. 이 옵션은 provider의 현재 상태를 반환한다는 점에서 `ref.watch`와 유사합니다. -하지만 `ref.watch`와 달리 공급자를 수신(listen)하지 않습니다. +하지만 `ref.watch`와 달리 provider를 수신(listen)하지 않습니다. 따라서 `ref.read`는 Notifier의 메서드 내부와 같이 `ref.watch`를 사용할 수 없는 곳에서만 사용해야 합니다. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/do_dont.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/do_dont.mdx index 730b69f6b..6859a04e6 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/do_dont.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/do_dont.mdx @@ -18,7 +18,7 @@ import { AutoSnippet, When } from "/src/components/CodeSnippet"; ## AVOID 위젯에서 provider를 초기화하지 마세요 -Providers는 스스로 초기화해야 합니다. +providers는 스스로 초기화해야 합니다. 위젯과 같은 외부 요소에 의해 초기화되어서는 안 됩니다. 그렇게 하지 않으면 경합 상태(race conditions) 및 예기치 않은 동작(unexpected behaviors)이 발생할 수 있습니다. @@ -81,7 +81,7 @@ provider는 일반적으로 "read" 작업을 나타내는 데 사용해야 합 final submitProvider = FutureProvider((ref) async { final formState = ref.watch(formState); - // Bad: 공급자는 'write' 작업에 사용해서는 안 됩니다. + // Bad: providers는 'write' 작업에 사용해서는 안 됩니다. return http.post('https://my-api.com', body: formState.toJson()); }); ``` @@ -121,7 +121,7 @@ class Example extends ConsumerWidget { ## AVOID 동적으로 providers 생성하지 않기 -공급자는 최상위 레벨(top-level)의 final 변수만 사용해야 합니다. +providers는 최상위 레벨(top-level)의 final 변수만 사용해야 합니다. **Do**: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/eager_initialization.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/eager_initialization.mdx index 60105a887..f7e30d615 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/eager_initialization.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/eager_initialization.mdx @@ -1,5 +1,5 @@ --- -title: Providers의 빠른 초기화(Eager initialization) +title: providers의 빠른 초기화(Eager initialization) version: 2 --- @@ -14,7 +14,7 @@ import requireValue from "/docs/essentials/eager_initialization/require_value"; 이는 애플리케이션의 특정 부분에서만 사용되는 provider에 유용합니다. 안타깝게도 Dart의 작동 방식(tree shaking 목적)으로 인해 provider를 이른 초기화(eagerly initialized)해야 하는 것으로 플래그를 지정할 수 있는 방법은 없습니다. -그러나 한 가지 해결책은 애플리케이션의 루트에서 초기화하려는 공급자를 강제로 읽는(read) 것입니다. +그러나 한 가지 해결책은 애플리케이션의 루트에서 초기화하려는 providers를 강제로 읽는(read) 것입니다. 권장되는 접근 방식은 `ProviderScope` 바로 아래에 배치된 소비자(Consumer)에서 provider를 단순히 "watch"하는 것입니다: @@ -22,7 +22,7 @@ import requireValue from "/docs/essentials/eager_initialization/require_value"; raw={consumerExample} translations={{ render: " // TODO: 여기에서 앱 렌더링", - watch: " // 공급자를 감시하여 공급자를 열심히 초기화합니다.\n // \"watch\"를 사용하면 공급자가 폐기되지 않고 계속 살아 있습니다.", + watch: " // providers를 감시(watch)하여 providers를 빠른 초기화합니다.\n // \"watch\"를 사용하면 provider가 폐기(disposed)되지 않고 계속 살아(alive) 있습니다.", }} /> @@ -47,7 +47,7 @@ import requireValue from "/docs/essentials/eager_initialization/require_value"; #### 이 접근 방식을 사용하면 로딩 및 오류 상태를 어떻게 처리할 수 있나요? `Consumer`에서 일반적으로 처리하는 것처럼 로딩/오류 상태를 처리할 수 있습니다. -`_EagerInitialization`은 프로바이더가 "loading" 상태인지 확인하고, 만약 그렇다면 `child` 대신 `CircularProgressIndicator`를 반환할 수 있습니다: +`_EagerInitialization`은 provider가 "loading" 상태인지 확인하고, 만약 그렇다면 `child` 대신 `CircularProgressIndicator`를 반환할 수 있습니다: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/faq.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/faq.mdx index a7c29b7f7..0bf406344 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/faq.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/faq.mdx @@ -29,7 +29,7 @@ provider를 다시 계산한 후 새 값을 신경 쓰지 않는다면 `invalida 반환된 값을 사용하지 않고 `ref.refresh`를 사용하려고 하면 경고가 표시됩니다. ::: -동작의 주요 차이점은 무효화(invalidating) 직후에 공급자를 읽으면 공급자가 **즉시(immediately)** 재계산(recomputes)한다는 것입니다. +동작의 주요 차이점은 무효화(invalidating) 직후에 provider를 읽으면 provider가 **즉시(immediately)** 재계산(recomputes)한다는 것입니다. 반면, `invalidate`를 호출하고 바로 읽지 않으면 업데이트가 _나중에(later)_ 트리거됩니다. 이 "나중에(later)" 업데이트는 일반적으로 다음 프레임이 시작될 때 이루어집니다. @@ -80,7 +80,7 @@ ref.read(yourNotifierProvider.notifier).yourMethod(); 페이지 오프셋이 변경되면 위젯이 이전에 표시된 페이지를 계속 수신하고 싶지 않을 것입니다. - `InheritedWidget`은 위젯이 언제 청취(listening)를 중단하는지 추적할 수 있는 방법이 없습니다. - Riverpod은 때때로 공급자가 수신 대기 중인지 여부를 추적하는 데 의존합니다. + Riverpod은 때때로 provider가 수신 대기 중인지 여부를 추적하는 데 의존합니다. 이 기능은 자동 폐기 메커니즘(auto dispose mechanism)과 provider에게 인수를 전달하는 기능 모두에 매우 중요합니다. 이러한 기능들이 Riverpod를 강력하게 만드는 원동력입니다. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/first_request.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/first_request.mdx index 1841d907e..2d7957eb8 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/first_request.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/first_request.mdx @@ -49,7 +49,7 @@ void main() { 네트워크 요청을 수행하는 것을 보통 "비즈니스 로직"이라고 부릅니다. Riverpod에서 비즈니스 로직은 "providers" 내부에 배치됩니다. -프로바이더는 초강력(super-powered) 함수입니다. +provider는 초강력(super-powered) 함수입니다. 일반 함수처럼 동작하지만 다음과 같은 이점이 추가됩니다: - 캐시됩니다. @@ -57,7 +57,7 @@ Riverpod에서 비즈니스 로직은 "providers" 내부에 배치됩니다. - 리스너를 추가할 수 있습니다. - 데이터가 변경될 때 자동으로 다시 실행됩니다. -따라서 공급자는 _GET_ 네트워크 요청에 가장 적합합니다. (_POST/etc_ 요청의 경우, 참조) +따라서 providers는 _GET_ 네트워크 요청에 가장 적합합니다. (_POST/etc_ 요청의 경우, 참조) 예를 들어, 지루할 때 할 수 있는 무작위 활동을 제안하는 간단한 애플리케이션을 만들어 보겠습니다. 이를 위해 [Bored API](https://boredapi.com/)를 사용하겠습니다. @@ -87,12 +87,12 @@ Riverpod에서 비즈니스 로직은 "providers" 내부에 배치됩니다. }} /> -### 공급자 만들기 +### provider 만들기 이제 모델이 생겼으니 API 쿼리를 시작할 수 있습니다. -그러기 위해서는 첫 번째 공급자를 만들어야 합니다. +그러기 위해서는 첫 번째 provider를 만들어야 합니다. -공급자를 정의하는 구문은 다음과 같습니다: +provider를 정의하는 구문은 다음과 같습니다: -이 변수는 공급자와 상호 작용하는 데 사용되는 변수입니다. +이 변수는 provider와 상호 작용하는 데 사용되는 변수입니다. 변수는 final이여야하고, "top-level" (global)에 선언되어야 합니다. @@ -127,7 +127,7 @@ Riverpod에서 비즈니스 로직은 "providers" 내부에 배치됩니다. :::tip "어떤 provider를 선택해야 하나"라는 관점에서 생각하지 마세요. 대신 "내가 무엇을 반환하고 싶은가"라는 관점에서 생각하세요. -공급자 유형은 자연스럽게 따라올 것입니다. +provider 타입은 자연스럽게 따라올 것입니다. ::: @@ -139,11 +139,11 @@ Riverpod에서 비즈니스 로직은 "providers" 내부에 배치됩니다. description: <> 종종 provider 타입 뒤에 "수정자(Modifiers)"가 표시될 수 있습니다. -수정자(Modifiers)는 선택 사항이며, 타입에 안전한 방식으로 공급자의 동작을 조정하는 데 사용됩니다. +수정자(Modifiers)는 선택 사항이며, 타입에 안전한 방식으로 provider의 동작을 조정하는 데 사용됩니다. 현재 두 가지 수정자를 사용할 수 있습니다: -- 공급자가 더 이상 사용되지 않을 때 캐시를 자동으로 지우는 `autoDispose`. +- provider가 더 이상 사용되지 않을 때 캐시를 자동으로 지우는 `autoDispose`. 도 참조하세요. - provider에 인수를 전달할 수 있는 `family`. 도 참조하세요. @@ -156,7 +156,7 @@ Riverpod에서 비즈니스 로직은 "providers" 내부에 배치됩니다. label: "Ref", description: <> -다른 provider와 상호작용하는 데 사용되는 객체입니다. +다른 providers와 상호작용하는 데 사용되는 객체입니다. 모든 providers는 provider 함수의 매개변수(parameter) 또는 Notifier의 속성(property)으로 하나씩 가지고 있습니다. @@ -167,8 +167,8 @@ Riverpod에서 비즈니스 로직은 "providers" 내부에 배치됩니다. label: "provider 함수", description: <> -여기에 프로바이더의 로직을 배치합니다. -이 함수는 공급자를 처음 읽을 때 호출됩니다. +여기에 providers의 로직을 배치합니다. +이 함수는 provider를 처음 읽을 때 호출됩니다. 이후 읽기는 이 함수를 다시 호출하지 않고 대신 캐시된 값을 반환합니다. @@ -191,9 +191,9 @@ Result myFunction(MyFunctionRef ref) { label: "어노테이션(annotation)", description: <> -모든 프로바이더는 `@riverpod` 또는 `@Riverpod()`로 어노테이션해야 합니다. +모든 providers는 `@riverpod` 또는 `@Riverpod()`로 어노테이션해야 합니다. 이 어노테이션은 전역 함수나 클래스에 배치할 수 있습니다. -이 어노테이션을 통해 프로바이더를 구성할 수 있습니다. +이 어노테이션을 통해 provider를 설정(config)할 수 있습니다. 예를 들어, `@Riverpod(keepAlive: true)`를 작성하여 "auto-dispose"(나중에 살펴보겠습니다)를 비활성화할 수 있습니다. @@ -212,7 +212,7 @@ Result myFunction(MyFunctionRef ref) { 그 외에도 함수는 제네릭을 포함하여 여러 개의 매개변수를 가질 수 있습니다. 이 함수는 원할 경우 `Future`/`Stream`을 반환할 수도 있습니다. -이 함수는 공급자를 처음 읽을 때 호출됩니다. +이 함수는 provider를 처음 읽을 때 호출됩니다. 이후 읽기는 함수를 다시 호출하지 않고 대신 캐시된 값을 반환합니다. @@ -236,7 +236,7 @@ Result myFunction(MyFunctionRef ref) { 여기서는 API에서 Activity를 _GET_하고자 합니다. _GET_은 비동기 연산이므로 `Future`를 생성해야 합니다. -따라서 앞서 정의한 구문을 사용하여 다음과 같이 공급자를 정의할 수 있습니다: +따라서 앞서 정의한 구문을 사용하여 다음과 같이 provider를 정의할 수 있습니다: `를 생성해야 합니다. json: " // 그런 다음 dart:convert를 사용하여 JSON 페이로드를 맵 데이터 구조로 디코딩합니다.", fromJson: " // 마지막으로 맵을 Activity 인스턴스로 변환합니다.", codegen_note: "// 코드 생성이 작동하는 데 필요합니다.", - codegen_provider: "/// 그러면 이 함수의 결과를 캐시할\n/// `activityProvider`라는 프로바이더가 생성됩니다.", + codegen_provider: "/// 그러면 이 함수의 결과를 캐시할\n/// `activityProvider`라는 provider가 생성됩니다.", }} /> -이 코드조각에서는 UI가 임의의 액티비티를 가져오는 데 사용할 수 있는 `activityProvider`라는 이름의 공급자를 정의했습니다. +이 코드조각에서는 UI가 임의의 액티비티를 가져오는 데 사용할 수 있는 `activityProvider`라는 이름의 provider를 정의했습니다. 다음과 같은 것은 주목할 가치가 있습니다: - 네트워크 요청은 UI가 provider를 한 번 이상 읽을 때까지 실행되지 않습니다. -- 이후 읽기는 네트워크 요청을 다시 실행하지 않고 이전에 가져온 활동을 반환합니다. -- UI가 이 공급자의 사용을 중단하면 캐시가 삭제됩니다. - 그런 다음 UI가 이 공급자를 다시 사용하면 새로운 네트워크 요청이 이루어집니다. -- 오류는 catch되지 않았습니다. 이는 공급자가 기본적으로 오류를 처리하기 때문에 자발적인 조치입니다. +- 이후 읽기는 네트워크 요청을 다시 실행하지 않고 이전에 가져온 활동(activity)을 반환합니다. +- UI가 이 provider의 사용을 중단하면 캐시가 삭제됩니다. + 그런 다음 UI가 이 provider를 다시 사용하면 새로운 네트워크 요청이 이루어집니다. +- 오류는 catch되지 않았습니다. 이는 provider들이 기본적으로 오류를 처리하기 때문에 자발적인 조치입니다. 네트워크 요청이나 JSON 파싱에서 에러가 발생하면 riverpod에서 에러를 catch합니다. 그러면 UI에 오류 페이지를 렌더링하는 데 필요한 정보가 자동으로 표시됩니다. :::info -Provider는 "지연(lazy)"입니다. 공급자를 정의해도 네트워크 요청이 실행되지 않습니다. -대신 공급자를 처음 읽을 때 네트워크 요청이 실행됩니다. +Provider는 "지연(lazy)"입니다. provider를 정의해도 네트워크 요청이 실행되지 않습니다. +대신 provider를 처음 읽을 때 네트워크 요청이 실행됩니다. ::: ### UI에서 네트워크 요청의 응답 렌더링하기 @@ -275,7 +275,7 @@ provider는 당연히 "ref" 객체에 액세스할 수 있으므로 이전에 pr 해결책은 `Consumer`라는 커스텀 위젯을 사용하는 것입니다. `Consumer`는 `Builder`와 비슷한 위젲이지만, "ref"를 제공한다는 추가적인 이점이 있습니다. -이를 통해 UI가 공급자를 읽을 수 있습니다. +이를 통해 UI가 provider들을 읽을 수 있습니다. 다음 예제는 `Consumer`를 사용하는 방법을 보여줍니다: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/passing_args.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/passing_args.mdx index 66dffdf65..bf6608799 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/passing_args.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/passing_args.mdx @@ -57,7 +57,7 @@ provider에게 매개변수(parameters)를 전달하려면 어노테이션이 {...family} translations={{ todo: " // TODO: 네트워크 요청을 수행하여 활동을 가져옵니다.", - raw_family: " // \".family\" 한정자를 사용합니다.\n // \"문자열\" 일반 유형은 인자 유형에 해당합니다.\n // 이제 공급자는 \"ref\" 위에 활동 유형이라는 추가 인수를 받습니다.", + raw_family: " // \".family\" 한정자를 사용합니다.\n // \"문자열\" 일반 유형은 인자 유형에 해당합니다.\n // 이제 provider는 \"ref\" 위에 활동 유형이라는 추가 인수를 받습니다.", raw_family_todo: " // TODO: \"activityType\"을 사용하여 활동을 가져오기 위한 네트워크 요청을 수행합니다.", raw_activityProvider2: "// 다시 알림의 경우 \".family\" 수정자를 사용하고 인수를 \"문자열\" 유형으로 지정합니다.", raw_ActivityNotifier: "// notifiers에 \".family\"를 사용할 때는 notifier 서브클래스를 변경해야 합니다:", @@ -94,7 +94,7 @@ provider에게 인수(arguments)를 전달할 때는 provider에서 "autoDispose @@ -118,7 +118,7 @@ provider에게 전달된 매개변수(parameters)는 어노테이션이 달린 이것이 수정자(modifier)를 "family"라고 부르는 이유입니다: -provider에게 매개 변수를 전달하면, 내부적으로 동일한 로직을 가진 상태 그룹(group of states)으로 공급자를 효과적으로 변환할 수 있기 때문입니다. +provider에게 매개 변수를 전달하면, 내부적으로 동일한 로직을 가진 상태 그룹(group of states)으로 provider를 효과적으로 변환할 수 있기 때문입니다. ::: @@ -135,7 +135,7 @@ provider에게 매개 변수를 전달하면, 내부적으로 동일한 로직 따라서 provider에게 전달되는 매개변수가 일관된 동일성(consistent equality)을 갖는 것이 중요합니다. :::caution -흔히 저지르는 실수는 새 객체가 `==`를 재정의하지 않는데도 새 객체를 프로바이더의 매개변수로 직접 인스턴스화하는 것입니다. +흔히 저지르는 실수는 새 객체가 `==`를 재정의하지 않는데도 새 객체를 provider의 매개변수로 직접 인스턴스화하는 것입니다. 예를 들어, `List`를 이렇게 전달하고 싶은 유혹을 받을 수 있습니다: @@ -124,7 +124,7 @@ provider가 리스닝되지 않으면 테스트 도중에 provider의 상태가 지금까지 테스트를 설정하는 방법과 provider와의 기본적인 상호 작용에 대해 살펴보았습니다. 하지만 경우에 따라서는 provider를 모킹(mock)하고 싶을 수도 있습니다. -멋진 부분: 추가 설정 없이 모든 공급자를 기본적으로 모킹할 수 있습니다. +멋진 부분: 추가 설정 없이 모든 providers를 기본적으로 모킹할 수 있습니다. 이는 `ProviderScope` 또는 `ProviderContainer`에 `overrides` 매개변수를 지정하면 가능합니다. 다음 provider를 살펴봅시다: @@ -132,7 +132,7 @@ provider가 리스닝되지 않으면 테스트 도중에 provider의 상태가 @@ -142,9 +142,9 @@ provider가 리스닝되지 않으면 테스트 도중에 provider의 상태가 raw={mockProvider} translations={{ container: " // 단위 테스트에서는 이전의 \"createContainer\" 유틸리티를 재사용합니다.", - providers: " // 모의(Mock)할 공급자 목록을 지정할 수 있습니다:", + providers: " // 모의(Mock)할 providers 목록을 지정할 수 있습니다:", exampleProvider: " // 이 경우 \"exampleProvider\"를 모방(Mock)하고 있습니다.", - note: " // 이 함수는 공급자의 일반적인 초기화 함수입니다.\n // 일반적으로 \"ref.watch\"를 호출하고 초기 상태를 반환하는 곳입니다.\n\n // 기본값인 \"Hello world\"를 사용자 정의 값으로 바꿔보겠습니다.\n // 그러면 `exampleProvider`와 상호작용하면 이 값이 반환됩니다.", + note: " // 이 함수는 provider의 일반적인 초기화 함수입니다.\n // 일반적으로 \"ref.watch\"를 호출하고 초기 상태를 반환하는 곳입니다.\n\n // 기본값인 \"Hello world\"를 사용자 정의 값으로 바꿔보겠습니다.\n // 그러면 `exampleProvider`와 상호작용하면 이 값이 반환됩니다.", providerScope: " // ProviderScope를 사용하여 위젯 테스트에서도 동일한 작업을 수행할 수 있습니다:", overrides: " // ProviderScope에는 정확히 동일한 \"overrides\" 매개 변수가 있습니다.", sameAsBefore: " // 이전과 동일", @@ -169,13 +169,13 @@ provider가 리스닝되지 않으면 테스트 도중에 provider의 상태가 Riverpod에서는 provider가 Future/Stream을 반환하는 경우가 매우 흔합니다. 이 경우 테스트에서 해당 비동기 연산이 완료될 때까지 기다려야 할 가능성이 있습니다. -이를 위한 한 가지 방법은 프로바이더의 '.future'를 읽는 것입니다: +이를 위한 한 가지 방법은 provider의 '.future'를 읽는 것입니다: @@ -183,7 +183,7 @@ Riverpod에서는 provider가 Future/Stream을 반환하는 경우가 매우 흔 ## Notifiers 모킹하기 일반적으로 Notifiers를 모의하는 것은 권장하지 않습니다. -왜냐하면 Notifiers는 자체적으로 인스턴스화할 수 없으며 프로바이더의 일부로 사용될 때만 작동하기 때문입니다. +왜냐하면 Notifiers는 자체적으로 인스턴스화할 수 없으며 provider의 일부로 사용될 때만 작동하기 때문입니다. 그 대신에, Notifier의 로직에 어느 정도 추상화 수준을 도입하여 그 추상화를 모킹할 수 있도록 해야 합니다. 예를 들어, Notifier을 모킹하는 대신 Notifier가 데이터를 가져오는 데 사용하는 "repository"를 모킹할 수 있습니다. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/websockets_sync.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/websockets_sync.mdx index 2e37a8d90..bae5d8312 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/websockets_sync.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/essentials/websockets_sync.mdx @@ -61,7 +61,7 @@ provider가 객체를 동기적으로 생성하면 객체가 소비되는 방식 코드 생성(code-generation)을 사용하지 않을 경우, -Riverpod은 `ChangeNotifier`와 `StateNotifier`를 즉시 지원하는 "legacy" 프로바이더를 제공합니다: `ChangeNotifierProvider` and `StateNotifierProvider`. +Riverpod은 `ChangeNotifier`와 `StateNotifier`를 즉시 지원하는 "legacy" providers를 제공합니다: `ChangeNotifierProvider` and `StateNotifierProvider`. 이들을 사용하는 것은 다른 종류의 provider를 사용하는 것과 비슷합니다. 가장 큰 차이점은 둘 다 반환된 객체를 자동으로 수신(listen)하고 폐기(dispose)한다는 점입니다. 이러한 providers는 새로운 비즈니스 로직에는 권장되지 않습니다. @@ -94,7 +94,7 @@ Riverpod은 `ChangeNotifier`와 `StateNotifier`를 즉시 지원하는 "legacy" diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/item.dart b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/item.dart deleted file mode 100644 index 1082ef6f3..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/item.dart +++ /dev/null @@ -1,12 +0,0 @@ -import 'package:freezed_annotation/freezed_annotation.dart'; - -import 'json.dart'; - -part 'item.freezed.dart'; -part 'item.g.dart'; - -@freezed -class Item with _$Item { - const factory Item({required int id}) = _Item; - factory Item.fromJson(Json json) => _$ItemFromJson(json); -} diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/json.dart b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/json.dart deleted file mode 100644 index 17cfb1c01..000000000 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/helpers/json.dart +++ /dev/null @@ -1 +0,0 @@ -typedef Json = Map; diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/motivation/motivation.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/motivation/motivation.mdx index 626fdb8be..08ef7859e 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/motivation/motivation.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/motivation/motivation.mdx @@ -57,10 +57,10 @@ Riverpod은 `AsyncValue`의 API를 통해 한 번에 두 개의 값(즉, 이전 1. 처음에, 요청이 이루어지고 빈 목록을 얻습니다; 2. 그런 다음 오류가 발생한다고 가정합니다. `[Item(id: -1)]`을 얻습니다; 3. 그런 다음 pull-to-refresh 로직으로 요청을 다시 시도합니다(예: `ref.invalidate`를 통해); -4. 첫 번째 공급자를 다시 로드하는 동안 두 번째 공급자는 여전히 `[Item(id: -1)]`을 노출합니다; +4. 첫 번째 provider를 다시 로드하는 동안 두 번째 provider는 여전히 `[Item(id: -1)]`을 노출합니다; 5. 이번에는 일부 파싱된 데이터가 올바르게 수신됩니다: 짝수 항목이 올바르게 반환됩니다. -프로바이더를 사용하면 위의 기능을 원격으로 구현할 수 없으며 해결 방법도 쉽지 않습니다. +Provider를 사용하면 위의 기능을 원격으로 구현할 수 없으며 해결 방법도 쉽지 않습니다. ### providers를 결합하는 것은 어렵고 에러가 발생하기 쉽습니다 @@ -95,7 +95,7 @@ Riverpod은 [autodispose]와 [keepAlive]와 같은 쉽게 이해할 수 있는 A {...autoDispose} translations={{ dice: " // 이 provider는 .autoDispose이므로,\n // 리스닝을 해제하면 현재 노출된 상태(state)가 폐기(dispose)됩니다.\n // 그런 다음 이 provider를 다시 수신(listen)할 때마다,\n // 새로운 주사위를 굴려서 다시 노출합니다.", - keepAlive: " // 위의 조건이 실패할 수 있습니다;\n // 그렇지 않은 경우 다음 명령어는 아무도 더 이상 수신하지 않더라도\n // 캐시된 상태를 유지하도록 공급자에게 지시합니다.", + keepAlive: " // 위의 조건이 실패할 수 있습니다;\n // 그렇지 않은 경우 다음 명령어는 아무도 더 이상 수신하지 않더라도\n // 캐시된 상태를 유지하도록 provider에게 지시합니다.", codegen_autoDispose: "// 코드 생성 시 .autoDispose가 기본값입니다.", }} /> @@ -103,7 +103,7 @@ Riverpod은 [autodispose]와 [keepAlive]와 같은 쉽게 이해할 수 있는 A 안타깝께도 원시 `InheritedWidget`으로는 이를 구현할 방법이 없으므로 Provider로 구현할 수 없습니다. ### 신뢰할 수 있는 매개변수화 매커니즘 부족 -Riverpod은 사용자가 [.family 수정자(modifier)]를 사용하여 "매개변수화된(parameterized)" 공급자를 선언할 수 있습니다. +Riverpod은 사용자가 [.family 수정자(modifier)]를 사용하여 "매개변수화된(parameterized)" providers를 선언할 수 있습니다. 실제로 `.family`는 Riverpod의 가장 강력한 기능 중 하나이며, Riverpod의 혁신의 핵심입니다. 예를 들어, 엄청한 [로직의 단순화]을 가능하게 합니다. diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/provider_vs_riverpod.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/provider_vs_riverpod.mdx index 791ec1d53..61473160e 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/provider_vs_riverpod.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/provider_vs_riverpod.mdx @@ -17,7 +17,7 @@ import { pkg:Provider나 pkg:Riverpod에서 제공되는 provider들을 "provider"로 표기합니다. ::: -## 공급자(Provider) 정의하기 +## Provider 정의하기 두 패키지의 가장 큰 차이점은 "providers"를 정의하는 방식입니다. @@ -111,7 +111,7 @@ class Example extends ConsumerWidget { - Riverpod에서는 `BuildContext.watch` 대신 `ConsumerWidget`에서 가져온 `WidgetRef`를 사용하여 `WidgetRef.watch`를 수행합니다. -- Riverpod은 제네릭 타입에 의존하지 않습니다. 대신 공급자 정의(provider definition)를 통해 생성된 변수(variable)에 의존합니다. +- Riverpod은 제네릭 타입에 의존하지 않습니다. 대신 provider 정의(definition)를 통해 생성된 변수(variable)에 의존합니다. 문구가 얼마나 유사한지도 주목하세요. Provider와 Riverpod은 모두 "watch" 키워드를 사용하여 "이 위젯은 값이 변경되면 다시 빌드되어야 합니다"라고 설명합니다. @@ -222,7 +222,7 @@ ProxyProvider( ) ``` -이 프로바이더는 `UserIdNotifier.userId`가 변경될 때마다 자동으로 새 `String`을 반환합니다. +이 provider는 `UserIdNotifier.userId`가 변경될 때마다 자동으로 새 `String`을 반환합니다. Riverpod에서도 비슷한 작업을 수행할 수 있지만 구문이 다릅니다. 먼저, Riverpod에서 `UserIdNotifier`의 정의는 다음과 같습니다: @@ -350,9 +350,9 @@ final userNotifierProvider = ChangeNotifierProvider((ref) { 이 스니펫의 핵심은 `ref.listen` 줄입니다. 이 `ref.listen` 함수는 provider를 수신 대기하고, provider가 변경될 때마다 함수를 실행하는 유틸리티입니다. -해당 함수의 `previous` 및 `next` 매개 변수는 공급자가 변경되기 전의 마지막 값과 변경된 후의 새 값에 해당합니다. +해당 함수의 `previous` 및 `next` 매개 변수는 provider가 변경되기 전의 마지막 값과 변경된 후의 새 값에 해당합니다. -## 범위 지정 공급자(Scoping Providers) vs `.family` + `.autoDispose` +## 범위 지정(Scoping) Providers vs `.family` + `.autoDispose` pkg:Provider에서 범위 지정은 두 가지 용도로 사용되었습니다: - 페이지 이탈 시 상태 소멸(destroying state) - 페이지당 커스텀 상태 보유 @@ -366,8 +366,8 @@ pkg:Provider에서 범위 지정은 두 가지 용도로 사용되었습니다: Riverpod은 다른 접근 방식을 취합니다: 첫째, 범위 지정(Scoping) providers는 권장하지 않으며, 둘째, `.family` 및 `.autoDispose`는 이를 완전히 대체하는 솔루션 입니다. -Riverpod 내에서 '.autoDispose'로 표시된 공급자는 더 이상 사용되지 않을 때 자동으로 상태를 소멸(destroy)합니다. -공급자를 제거하는 마지막 위젯이 마운트 해제되면 Riverpod은 이를 감지하고 공급자를 파기(destroy)합니다. +Riverpod 내에서 '.autoDispose'로 표시된 providers는 더 이상 사용되지 않을 때 자동으로 상태를 소멸(destroy)합니다. +provider를 제거하는 마지막 위젯이 언마운트되면, Riverpod은 이를 감지하고 providers를 파기(destroy)합니다. 이 동작을 테스트하려면 제공자에서 이 두 가지 수명 주기 메서드를 사용해 보세요: diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/quickstart.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/quickstart.mdx index 559a71069..d3a3fa6c0 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/quickstart.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/from_provider/quickstart.mdx @@ -10,7 +10,7 @@ version: 1 실제로 Provider에서 Riverpod로 마이그레이션하는 것은 매우 간단합니다. -마이그레이션은 기본적으로 *증분* 방식으로 수행할 수 있는 몇 가지 단계로 구성됩니다. +마이그레이션은 기본적으로 *단계적* 방식으로 수행할 수 있는 몇 가지 단계로 구성됩니다. ## `ChangeNotifierProvider`로 시작하기 @@ -85,14 +85,16 @@ MultiProvider( ] ) ``` + 이렇게 하면 처음에 루트 위젯만 `ConsumerWidget`으로 변환하면 됩니다. 이렇게 하면 pkg:Riverpod로 마이그레이션하는 것이 훨씬 쉬워집니다. + ## 한번에 하나씩 Provider를 마이그레이션하세요 기존 앱이 있는 경우, 모든 Provider를 한꺼번에 마이그레이션하지 마세요! -장기적으로 모든 애플리케이션을 Riverpod로 이동하려고 노력해야 하지만, **자신을 지치게(burn) 하지 마세요**. +장기적으로 모든 애플리케이션을 Riverpod로 이동하려고 노력해야 하지만, **자신을 지치게(burn out) 하지 마세요**. 한번에 하나의 Provider씩 처리하세요. 위의 예를 들어보겠습니다. `myNotifierProvider`를 Riverpod으로 **완전히** 마이그레이션한다는 것은 다음과 같이 작성하는 것을 의미합니다: @@ -108,27 +110,27 @@ class MyNotifier extends Notifier { final myNotifierProvider = NotifierProvider(MyNotifier.new); ``` -.. 그리고 _또한_ 해당 공급자가 소비되는 방식을 변경해야 합니다, -예를 들어 이 공급자에 대한 각 `context.watch`를 `ref.watch`로 변경해야 합니다. +.. 그리고 _또한_ 해당 provider가 소비되는 방식을 변경해야 합니다, +예를 들어 이 provider에 대한 각 `context.watch`를 `ref.watch`로 변경해야 합니다. 이 작업은 시간이 다소 걸리고 오류가 발생할 수 있으므로, 한 번에 끝내려고 서두르지 마세요. ## `ProxyProvider` 마이그레이션 -pkg:Provider 내에서 `ProxyProvider`는 다른 프로바이더의 값을 결합하는 데 사용됩니다; -빌드는 다른 프로바이더의 값에 따라 반응적(reactively)으로 달라집니다. +pkg:Provider 내에서 `ProxyProvider`는 다른 Providers의 값을 결합하는 데 사용됩니다; +빌드는 다른 Providers의 값에 따라 반응적(reactively)으로 달라집니다. -Riverpod에서는 대신 프로바이더는 [기본적으로 컴포저블이 가능]하므로, -`ProxyProvider`를 마이그레이션할 때 한 프로바이더에서 다른 프로바이더로 직접 종속성을 선언하려면 `ref.watch`를 작성하기만 하면 됩니다. +Riverpod에서는 대신 providers는 [기본적으로 컴포저블이 가능]하므로, +`ProxyProvider`를 마이그레이션할 때 한 provider에서 다른 provider로 직접 종속성을 선언하려면 `ref.watch`를 작성하기만 하면 됩니다. 오히려 Riverpod에서 값을 결합하는 것이 더 간단하고 직관적으로 느껴질 것이므로 마이그레이션을 통해 코드를 크게 간소화할 수 있습니다. -또한 두 개 이상의 공급자를 결합할 때, 복잡한 과정을 거칠 필요 없이 `ref.watch`를 하나 더 추가하기만 하면 바로 사용할 수 있습니다. +또한 두 개 이상의 providers를 결합할 때, 복잡한 과정을 거칠 필요 없이 `ref.watch`를 하나 더 추가하기만 하면 바로 사용할 수 있습니다. ## 빠른(Eager) 초기화 -Riverpod의 프로바이더는 최종 전역(global) 변수이기 때문에 [기본적으로 지연(Lazy)] 초기화 됩니다. +Riverpod의 providers는 최종 전역(global) 변수이기 때문에 [기본적으로 지연(Lazy)] 초기화 됩니다. -시작 시 일부 워밍업 데이터나 유용한 서비스를 초기화해야 하는 경우, 가장 좋은 방법은 `MultiProvider`를 넣었던 위치에서 프로바이더를 먼저 읽는 것입니다. +시작 시 일부 워밍업 데이터나 유용한 서비스를 초기화해야 하는 경우, 가장 좋은 방법은 `MultiProvider`를 넣었던 위치에서 provider를 먼저 읽는 것입니다. 즉, Riverpod은 강제로 초기화할 수 없기 때문에, 시작 단계에서 읽고 캐시하여, 나머지 애플리케이션 내에서 필요할 때 바로 사용할 수 있도록(warm and ready) 할 수 있습니다. @@ -182,6 +184,10 @@ class MyNotifier extends _$MyNotifier { 이 가이드에 따라 나중에 한 단계 더 나아가 코드생성으로 마이그레이션할 수 있습니다. +[시작하기]: /docs/introduction/getting_started +[sandbox]: https://dartpad.dev/?null_safety=true&id=ef06ab3ce0b822e6cc5db0575248e6e2 +[Provider]: https://pub.dev/packages/provider +[ChangeNotifierProvider]: /docs/providers/change_notifier_provider [코드 생성]: /docs/concepts/about_code_generation [Riverpod의 provider들]: /docs/providers/notifier_provider [기본적으로 컴포저블이 가능]: /docs/from_provider/motivation#combining-providers-is-hard-and-error-prone diff --git a/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started.mdx b/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started.mdx index 4df7a1eac..410939f73 100644 --- a/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started.mdx +++ b/website/i18n/ko/docusaurus-plugin-content-docs/current/introduction/getting_started.mdx @@ -7,21 +7,21 @@ version: 5 import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; import CodeBlock from "@theme/CodeBlock"; -import pubspec from "./getting_started/pubspec"; +import pubspec from "/docs/introduction/getting_started/pubspec"; import dartHelloWorld from "/docs/introduction/getting_started/dart_hello_world"; -import pubadd from "./getting_started/pub_add"; +import pubadd from "/docs/introduction/getting_started/pub_add"; import helloWorld from "/docs/introduction/getting_started/hello_world"; -import dartPubspec from "./getting_started/dart_pubspec"; -import dartPubadd from "./getting_started/dart_pub_add"; +import dartPubspec from "/docs/introduction/getting_started/dart_pubspec"; +import dartPubadd from "/docs/introduction/getting_started/dart_pub_add"; import { AutoSnippet, When, } from "/src/components/CodeSnippet"; import { Link } from "/src/components/Link"; -## Riverpod 온라인으로 경험해보기 +## 온라인에서 Riverpod 체험해보기 -Riverpod을 경험해보려면 [Dartpad](https://dartpad.dev/?null_safety=true&id=ef06ab3ce0b822e6cc5db0575248e6e2)나 [Zapp](https://zapp.run/new)에서 온라인으로 시도해보세요: +Riverpod을 체험해보려면 [Dartpad](https://dartpad.dev/?null_safety=true&id=ef06ab3ce0b822e6cc5db0575248e6e2)나 [Zapp](https://zapp.run/new)에서 온라인으로 사용해보세요: