Flutter-integraatio eksplisiittisellä containerin omistajuudella.
ProviderScope voi omistaa containerin tai vastaanottaa sen ulkopuolelta. Consumer-API:t pitävät WidgetRef-pääsyn yhteensopivana Riverpod-tyylisen koodin kanssa.
ProviderScope-omistajuus
Containerin omistajuus muuttaa dispose-vastuun.
Sisäinen container
ProviderScope(child: ...) disposetaan automaattisesti
Ulkoinen container
ProviderScope(container: c, ...) vaatii, että kutsuja kutsuu c.dispose()-metodia
Hallinnoimaton scope
UncontrolledProviderScope ei koskaan disposea containeria
Yleinen sudenkuoppa
Widget-testeissä muista disposeata ulkoisesti injektoitu ProviderContainer, jotta vältyt odottavien ajastimien vuodoilta.
Consumer-muunnelmat
Kaikki vaihtoehdot tarjoavat WidgetRefin; valitse widget-tyylin ja paikallisen tilan tarpeiden mukaan.
Sovelluksen juuri
Milloin kutakin käytetään
Consumer: local builder block for small reactive areas.
ConsumerWidget: stateless widget with build(context, ref).
ConsumerStatefulWidget: stateful widget with ref inside ConsumerState.
Esimerkki: ConsumerStatefulWidget
Käytä ConsumerStatea, kun tarvitset sekä WidgetRefin että paikallisen, muutettavan UI-tilan.
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),
),
],
);
}
}
Seuraavat askeleet
Testaus
Varmista containerin elinkaari, yliajot ja asynkroniset päivitykset yksikkö- ja widget-testeissä.
Avaa testit