API de Flutter

ProviderScope can own a container o receive one externally. Consumer APIs keep WidgetRef access compatible con 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

en widget tests, remember a dispose externally injected ProviderContainer a avoid pending timer leaks.

Consumer Variants

All options expose WidgetRef; choose by widget style y local state needs.

app root

runApp(const ProviderScope(child: MyApp()));

When a use each

Consumer: local builder block for small reactive areas.
ConsumerWidget: stateless widget with build(context, ref).
ConsumerStatefulWidget: stateful widget with ref inside ConsumerState.

ejemplo: ConsumerStatefulWidget

Use ConsumerState when you need both WidgetRef y local mutable UI state.

home_page.dart
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 internals schedule rebuilds a post-frame, reducing setState-during-build issues.
Use WidgetRef.watch solo para values that should trigger rebuilds.
Keep side effects outside build; use callbacks y invoke/refresh methods.

Siguientes pasos

Testing

Validate container lifecycle, overrides, y async updates en unit y widget tests.

Open pruebas

API Referencia

See signatures para ProviderScope, WidgetRef, y container methods.

Open API Referencia