명시적인 container 소유권을 가진 Flutter 통합.

ProviderScope는 container를 소유하거나 외부에서 전달받을 수 있습니다. Consumer API는 WidgetRef 접근을 Riverpod 스타일 코드와 호환되게 유지합니다.

ProviderScope 소유권

container 소유권은 dispose 책임을 바꿉니다.

내부 container

ProviderScope(child: ...)가 자동으로 dispose 합니다

외부 container

ProviderScope(container: c, ...)는 호출자가 c.dispose() 해야 합니다

비관리 scope

UncontrolledProviderScope는 container를 절대 dispose 하지 않습니다

자주 하는 실수

widget 테스트에서는 외부에서 주입한 ProviderContainer를 반드시 dispose하여 남은 timer 누수를 방지하세요.

Consumer 변형

모든 옵션은 WidgetRef를 노출합니다. 위젯 스타일과 로컬 상태 필요에 따라 선택하세요.

앱 루트

각 항목을 언제 사용할지

Consumer: 작은 반응형 영역을 위한 로컬 builder 블록.
ConsumerWidget: build(context, ref)를 가진 stateless widget.
ConsumerStatefulWidget: ConsumerState 안에 ref가 있는 stateful widget.

예시: ConsumerStatefulWidget

WidgetRef와 로컬 mutable UI 상태가 모두 필요할 때는 ConsumerState를 사용하세요.

class HomePage extends ConsumerStatefulWidget {
  const HomePage({super.key});

  @override
  ConsumerState<HomePage> createState() => _HomePageState();
}

class _HomePageState extends ConsumerState<HomePage> {
  bool expanded = false;

  @override
  Widget build(BuildContext context) {
    final user = ref.watch(currentUser);
    return Column(
      children: [
        Text('$user'),
        Switch(
          value: expanded,
          onChanged: (v) => setState(() => expanded = v),
        ),
      ],
    );
  }
}
Consumer 내부 동작은 rebuild를 프레임 이후로 예약해 build 중 setState 호출 문제를 줄입니다.
WidgetRef.watch는 rebuild를 유발해야 하는 값에만 사용하세요.
부수 효과는 build 밖에 두고, 콜백과 invoke/refresh 메서드를 사용하세요.

다음 단계

테스트

container 생명주기, override, 비동기 업데이트를 unit 및 widget 테스트에서 검증하세요.

테스트 열기

API 참조

ProviderScope, WidgetRef, container 메서드의 시그니처를 확인하세요.

API 참조 열기