Flutter integration with explicit container ownership.
ProviderScope can own a container or receive one externally. Consumer APIs keep WidgetRef access compatible with Riverpod-style code.
ProviderScope Ownership
Container ownership changes disposal responsibility.
Internal container
ProviderScope(child: ...) disposes automatically
External container
ProviderScope(container: c, ...) requires c.dispose() by caller
Uncontrolled scope
UncontrolledProviderScope never disposes the container
Common pitfall
In widget tests, remember to dispose externally injected ProviderContainer to avoid pending timer leaks.
Consumer Variants
All options expose WidgetRef; choose by widget style and local state needs.
App root
runApp(const ProviderScope(child: MyApp()));
When to use each
Consumer: local builder block for small reactive areas.
ConsumerWidget: stateless widget with build(context, ref).
ConsumerStatefulWidget: stateful widget with ref inside ConsumerState.
Example: ConsumerStatefulWidget
Use ConsumerState when you need both WidgetRef and local mutable UI state.
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),
),
],
);
}
}
अगले कदम
Provider
Validate container lifecycle, overrides, and async updates in unit and widget tests.
Open TestingStateProvider
See signatures for ProviderScope, WidgetRef, and container methods.
Open API Reference