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: paikallinen rakentajablokki pienille reaktiivisille alueille.
ConsumerWidget: tilaton widget, jonka build(context, ref).
ConsumerStatefulWidget: tilallinen widget, jossa ref on ConsumerStatessa.
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