본문 바로가기
플러터/플러터 사용기

플러터-프로바이더-궁금했던-내용들

by 신재은👩🏼‍💻 2024. 2. 2.

1. provider는 changenotifier랑 notifylistener랑만 묶어서 사용할 수 있나?

  • provider 패키지는 ChangeNotifier와 함께 사용하기에 최적화되어 있으나, 이것만이 유일한 사용 방법은 아닙니다. ChangeNotifier는 상태 변경을 알리기 위해 notifyListeners() 메서드와 함께 자주 사용되지만, provider는 다양한 타입의 데이터와 객체를 관리할 수 있습니다. 예를 들어, 단순한 값(value)이나 다른 타입의 객체를 공유하고자 할 때 Provider<T>를 사용할 수 있고, 이 경우 ChangeNotifier와 notifyListeners()는 필요하지 않습니다.
  • 또한, provider 패키지는 ListenableProvider, StreamProvider, FutureProvider 등 다양한 종류의 provider를 제공하여, 다른 종류의 객체 및 데이터 스트림을 관리할 수 있도록 합니다. 이러한 provider들은 ChangeNotifier와는 독립적으로 사용될 수 있습니다.

2. provider 구현 시 다 provider.of<t>(context) 또는 consumer<t> 위젯으로만 상태에 접근하고 ui를 구성할 수 있는가?

  • Provider.of<T>(context)와 Consumer<T>는 provider를 사용하여 상태에 접근하고 UI를 구성하는 두 가지 주요 방법입니다. 그러나 이것이 유일한 방법은 아닙니다.
  • Provider.of<T>(context, listen: false)를 사용하여 상태를 읽을 수 있지만, 상태 변경에 따른 위젯의 자동 리빌드는 트리거하지 않습니다. 이는 주로 이벤트 핸들러나 생명주기 메서드 내에서 상태를 읽을 때 유용합니다.
  • Consumer<T> 위젯은 상태의 변화에 따라 UI 일부를 리빌드하려는 경우에 사용됩니다. Consumer<T>는 builder 함수를 통해 상태를 전달받으며, 이를 통해 상태에 따라 동적인 UI를 구성할 수 있습니다.
  • 또한, Selector<T, S>를 사용하여 상태 객체의 특정 부분만을 감시하고, 해당 부분이 변경될 때만 위젯을 리빌드할 수 있습니다. 이는 성능 최적화에 유용하게 사용될 수 있습니다.
  • context.watch<T>()와 context.read<T>()는 hooks 패키지 또는 flutter_hooks와 함께 사용될 때 유용한 새로운 접근 방법을 제공합니다. watch는 상태 변화를 감시하고, read는 한 번만 상태를 읽습니다. 이 방법들은 Flutter의 HookWidget 내에서 사용됩니다.

3. provider.of<t>(context, listen: false)를 사용하면 위젯이 상태 변경에 반응하지 않도록 할 수 있다. 이후 상태 변경 시에만 리빌드되어야 하는 위젯에는 consumer<f>를 사용한다.

4. 상태 관리 로직과 ui 코드를 명확히 분리해야 한다.


1.  hook이란? hooks와 차이가 있나? react hook과 뭐가 다른가? hookwidget은 플러터 기본 위젯인가?

  • Hook: 일반적으로 "훅"은 컴포넌트의 생명주기 이벤트나 상태 등을 관리하기 위한 함수나 메커니즘을 의미합니다. 특정 작업을 위해 "걸어두는" 함수라고 볼 수 있습니다.
  • Hooks (Flutter): flutter_hooks 패키지에서 제공하는 여러 종류의 훅을 의미합니다. 예를 들어, useState, useEffect 등이 있으며, 이들은 각각 특정 작업을 위해 사용됩니다.
  • React Hook: React에서 함수형 컴포넌트 내에서 상태 관리와 부수 효과(side effects)를 처리하기 위해 도입된 기능입니다. useState, useEffect 같은 훅을 사용하여 클래스 컴포넌트의 기능을 함수형 컴포넌트에서 사용할 수 있게 해줍니다.
  • HookWidget: flutter_hooks에서 제공하는 위젯으로, HookWidget을 상속받은 위젯 내에서 Flutter의 훅을 사용할 수 있게 해줍니다. HookWidget은 Flutter의 기본 위젯은 아니며, flutter_hooks 패키지를 통해 제공됩니다.

2. context.watch<t>() + context.read<t>랑 changenotifier + notifylistener랑 무슨 차이가 있는가?

  • context.watch<T>()와 context.read<T>()는 provider 패키지의 일부로 flutter_hooks와 함께 사용될 때 특히 유용합니다. watch<T>()는 해당 타입의 객체가 변경될 때마다 위젯을 리빌드하도록 합니다. read<T>()는 객체를 읽을 수는 있지만, 객체가 변경될 때 리빌드하지는 않습니다.
  • ChangeNotifier는 상태 관리를 위한 클래스로, 상태가 변경될 때 notifyListeners() 메서드를 호출하여 상태 변화를 알립니다. 이를 통해 ChangeNotifier를 듣고 있는 위젯들이 리빌드됩니다.
  • 기본적으로, ChangeNotifier와 notifyListeners()는 상태 관리의 "로직" 부분을 담당하고, context.watch<T>()와 context.read<T>()는 상태 관리의 "연결" 부분을 담당하여, 상태 변경에 따라 UI가 어떻게 반응할지를 정의합니다.

3. useprovider가 flutter_hooks에만 있는가? 유사한 게 provider나 riverpod에 있지 않는가?

  • useProvider는 flutter_hooks와 함께 provider 패키지를 사용할 때 훅으로, 특정 provider로부터 상태를 읽어오는 용도로 사용됩니다. HookWidget 내에서 provider의 상태를 구독하고, 상태가 변경될 때마다 자동으로 위젯을 리빌드하게 해줍니다.
  • provider 패키지 자체에서는 Provider.of<T>(context), Consumer<T>, Selector<T, S> 같은 방법으로 상태에 접근하고 UI를 업데이트할 수 있습니다. useProvider는 이들과 비슷한 역할을 하지만, flutter_hooks를 사용하는 HookWidget 내에서 더 간결하게 상태를 관리할 수 있게 해줍니다.
  • Riverpod는 provider의 개선된 버전으로, 컨텍스트에 의존하지 않는 방식으로 상태 관리를 가능하게 합니다. Riverpod에서는 useProvider와 유사한 역할을 하는 Consumer, ConsumerWidget, ref.watch, ref.read 등을 사용할 수 있습니다. Riverpod는 provider의 제약사항을 해결하고 더 유연한 상태 관리를 위해 디자인되었습니다.

1. riverpod은 context 사용 안 하는 거 맞는가, get(getx)도 context 사용 안 하지 않는가. 그런데 context를 사용하지 않으면 단점이 있지 않나?

  1. Riverpod과 GetX의 Context 사용 여부:
    • Riverpod: 맞습니다, Riverpod는 Flutter의 BuildContext에 의존하지 않는 상태 관리 솔루션입니다. Riverpod는 Provider 패키지의 개선된 버전으로, Provider의 몇 가지 제약사항(특히 context에 대한 의존성)을 해결하기 위해 만들어졌습니다. Riverpod는 애플리케이션의 상태를 전역적으로 접근 가능한 "Provider Container" 내에서 관리하여, 어느 곳에서나 상태에 접근할 수 있게 합니다.
    • GetX: GetX 역시 Flutter의 BuildContext에 크게 의존하지 않는 상태 관리, 라우팅, 의존성 주입 등을 제공하는 패키지입니다. GetX는 상태 관리를 위해 간결하고 효율적인 API를 제공하며, 특히 대규모 애플리케이션에서의 사용을 목표로 합니다.
  2. Context를 사용하지 않을 때의 단점:
    • Context의 역할: Flutter에서 BuildContext는 위젯 트리의 위치를 나타내며, 테마, 로케일, 미디어 쿼리 등 위젯 트리의 다른 부분에서 제공하는 데이터에 접근할 수 있는 방법을 제공합니다.
    • Context 의존성 제거의 장점: Context에 의존하지 않는다는 것은 종종 코드의 재사용성과 테스트 용이성을 높일 수 있습니다. 특히 Riverpod와 같은 패키지는 Provider를 사용할 때 발생할 수 있는 "Provider not found" 같은 오류를 피할 수 있게 해주며, 어플리케이션의 어느 곳에서나 쉽게 상태에 접근할 수 있게 해줍니다.
    • 단점: 하지만, Context를 전혀 사용하지 않는다면, 위젯 트리의 위치에 따른 데이터 접근성이나 위젯의 생명주기와 연결된 기능들을 활용하는 데 제한이 있을 수 있습니다. 예를 들어, 상위 위젯에서 제공하는 데이터를 하위 위젯이 접근할 때 BuildContext가 필요한 경우가 있습니다. 이런 경우에는 Riverpod의 ConsumerWidget이나 GetX의 GetBuilder와 같은 위젯을 사용하여 해결할 수 있습니다.

1. 상태 관리는 context를 가지고 하는 게 더 안정적이지 않은가?

2. getx는 대규모 애플리케이션에서 쓰기 어렵지 않은가?

  1. 상태 관리와 Context의 안정성:
    • BuildContext를 사용하는 상태 관리 방식(예: Provider)은 Flutter 위젯 트리의 구조와 밀접하게 연관되어 있으며, 위젯의 위치에 따라 상태를 접근하고 관리할 수 있게 해줍니다. 이 방식은 특정한 컨텍스트 내에서 상태를 사용하려는 경우 매우 유용하고 직관적일 수 있습니다. 예를 들어, 특정 위젯 하위에서만 사용되는 상태를 관리할 때 Context를 활용하는 것이 적합합니다.
    • 하지만, Context에 의존하는 상태 관리 방식은 위젯 트리가 복잡해질수록 상태 접근에 있어 제약이 생길 수 있으며, 위젯 트리의 변경이 상태 관리 로직에 영향을 줄 수 있습니다. 따라서 Context를 사용하는 상태 관리 방식이 반드시 더 안정적이라고 말하기는 어렵습니다. 상황에 따라 Context를 사용하지 않는 상태 관리 방식(Riverpod, GetX 등)이 더 유연하고 확장성 있게 적용될 수 있습니다.
  2. GetX와 대규모 애플리케이션:
    • GetX는 상태 관리, 라우팅, 의존성 주입 등을 포괄적으로 제공하는 Flutter 패키지로, 간결하고 효율적인 API를 통해 개발자가 대규모 애플리케이션을 더 쉽게 관리할 수 있도록 설계되었습니다. GetX는 상태 관리뿐만 아니라, 애플리케이션의 다양한 측면을 포괄적으로 다루기 때문에, 실제로 대규모 프로젝트에서도 유용하게 사용될 수 있습니다.
    • GetX의 주요 장점 중 하나는 편리한 라우팅 관리와 강력한 의존성 주입 시스템입니다. 이러한 기능은 대규모 애플리케이션의 복잡성을 줄이고, 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.
    • 물론, 모든 상태 관리 솔루션과 마찬가지로 GetX 역시 특정한 사용 사례나 팀의 선호도에 따라 적합성이 달라질 수 있습니다. 따라서 GetX를 선택하기 전에 프로젝트의 요구사항과 팀의 작업 방식을 충분히 고려하는 것이 중요합니다.

(내용 지속적으로 추가될 예정...)