Интеграция Flutter с явным владением контейнером.
ProviderScope может владеть контейнером или получать его извне. API Consumer сохраняют доступ к WidgetRef, совместимый с кодом в стиле Riverpod.
Владение ProviderScope
Владение контейнером меняет ответственность за освобождение.
Внутренний контейнер
ProviderScope(child: ...) автоматически освобождается
Внешний контейнер
ProviderScope(container: c, ...) требует вызова c.dispose() от вызывающего
Неуправляемая область
UncontrolledProviderScope никогда не освобождает контейнер
Частая ошибка
В widget-тестах не забудьте освободить ProviderContainer, внедрённый извне, чтобы избежать утечек ожидающих таймеров.
Варианты Consumer
Все варианты предоставляют WidgetRef; выбирайте по стилю виджета и требованиям к локальному состоянию.
Корень приложения
Когда использовать каждый
Consumer: local builder block for small reactive areas.
ConsumerWidget: stateless widget with build(context, ref).
ConsumerStatefulWidget: stateful widget with ref inside 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),
),
],
);
}
}
Следующие шаги
Тестирование
Проверяйте жизненный цикл контейнера, переопределения и асинхронные обновления в unit- и widget-тестах.
Открыть тестированиеСправочник API
Смотрите сигнатуры ProviderScope, WidgetRef и методов контейнера.
Открыть справочник API