Інтеграція Flutter з явним володінням контейнером.
ProviderScope може володіти контейнером або отримувати його зовні. API Consumer зберігають сумісність доступу до WidgetRef із кодом у стилі Riverpod.
Володіння ProviderScope
Володіння контейнером змінює відповідальність за dispose.
Внутрішній контейнер
ProviderScope(child: ...) автоматично виконує dispose
Зовнішній контейнер
ProviderScope(container: c, ...) вимагає, щоб викликали c.dispose()
Неконтрольований scope
UncontrolledProviderScope ніколи не виконує dispose контейнера
Поширена помилка
У widget-тестах не забудьте dispose-нути ProviderContainer, інжектований ззовні, щоб уникнути витоків таймерів, що залишилися в черзі.
Варіанти Consumer
Усі варіанти надають WidgetRef; обирайте залежно від стилю віджета та потреб локального стану.
Корінь застосунку
Коли використовувати кожен
Consumer: локальний блок builder для невеликих реактивних областей.
ConsumerWidget: stateless widget з build(context, ref).
ConsumerStatefulWidget: stateful widget з ref всередині ConsumerState.
Приклад: ConsumerStatefulWidget
Використовуйте ConsumerState, коли вам потрібні і WidgetRef, і локальний змінний стан UI.
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),
),
],
);
}
}
Наступні кроки
Тести
Перевірте життєвий цикл контейнера, override-и та async-оновлення в unit- і widget-тестах.
Відкрити тестиДовідка API
Подивіться сигнатури ProviderScope, WidgetRef і методів контейнера.
Відкрити довідку API