ConsumerWidget und ref.watch
Teil des Abschnitts State Management der Flutter-Journey von Coddy. Lektion 17 von 27.
Jedes Widget kann einen Provider lesen, sobald es ein ref erhalten kann. Damit es eines erhält, musst du zwei Dinge ändern:
- Aus
extends StatelessWidgetwirdextends ConsumerWidget. builderhält einen zweiten Parameter,WidgetRef ref.
class CityName extends ConsumerWidget {
const CityName({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final city = ref.watch(cityProvider);
return Text(city);
}
}ref.watch(cityProvider) liefert dir den Wert des Providers, hier den Text Lisbon, und baut das Widget erneut, sobald sich dieser Wert ändert. Ohne ref.watch ist cityProvider nur der Provider selbst, nicht sein Wert.
Jedes Widget, das einen Wert benötigt, fragt ihn auf diese Weise ab, ganz gleich, wo es sich befindet. Nichts wird über Konstruktoren weitergegeben, und nichts benötigt context, um den Wert zu finden.
Aufgabe
EinfachCityName und Temperature zeigen Platzhalter an. Lass sie die Provider oben in der Datei lesen:
- Wandle beide in
ConsumerWidgets um. CityNamezeigt den Wert voncityProvideran.Temperaturezeigt den Wert vontemperatureProvidergefolgt von°Cin derselben Größe an.
Probier es selbst
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final cityProvider = Provider((ref) => 'Lisbon');
final temperatureProvider = Provider((ref) => 21);
void main() {
runApp(const ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
home: Scaffold(
appBar: AppBar(title: const CityName()),
body: const Center(child: Temperature()),
),
);
}
}
class CityName extends StatelessWidget {
const CityName({super.key});
@override
Widget build(BuildContext context) {
return const Text('City');
}
}
class Temperature extends StatelessWidget {
const Temperature({super.key});
@override
Widget build(BuildContext context) {
return const Text('0°C', style: TextStyle(fontSize: 64));
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in State Management
1State nach oben weitergeben
State an ein Kind weitergebenEinen Callback an ein Kind weitergebenCallbacks, die einen Wert übergebenState nach oben verschieben4Riverpod
Riverpod: ProviderScopeConsumerWidget und ref.watchRiverpod: StateProviderRiverpod: NotifierProvider, die andere Provider beobachtenDen Speicherort des Zustands wählenÜbe selbstständig: Online-Flutter-Compiler