Compile safe
Keine ProviderNotFoundException
mehr und kein Vergessen der Behandlungen von Ladezuständen.
Durch die Benutzung von Riverpod funktioniert dein Code, wenn er erfolgreich kompiliert.
Provider ohne Einschränkungen
Riverpod ist von Provider inspiriert, löst aber einige seiner Hauptprobleme, wie z.B. die Unterstützung mehrerer Provider desselben Typs, das Warten auf asynchrone Provider, das Hinzufügen von Providern von überall, ...
Hängt nicht von Flutter ab
Erstellen/teilen/testen von Providern, ohne Abhängigkeit zu Flutter. Dazu
gehört auch die Möglichkeit, auf Provider ohne
einen BuildContext
zu hören.
Gemeinsamen Zustand von überall aus deklarieren
Du musst nicht mehr zwischen deiner main.dart
und deinen UI Dateien
hin- und herspringen.
Platziere den Code deines gemeinsamen Zustands dort, wo er hingehört, sei
es in einem separaten Paket oder direkt neben dem Widget, das
ihn benötigt, ohne dass die Testbarkeit verloren geht.
// A shared state that can be accessed by multiple
// objects at the same time
final countProvider = StateProvider((ref) => 0);
// Consumes the shared state and rebuild when it changes
class Title extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(countProvider);
return Text('$count');
}
}
Neuberechnung von Zuständen/Neuaufbau der Benutzeroberfläche nur bei Bedarf
Listen müssen nicht mehr in der build
Methode sortiert/gefiltert
werden oder auf erweiterte Cache-Mechanismen zurückgreifen.
Mit Provider
und "families" sortierst du deine Liste oder machst HTTP
Requests nur noch, wenn du es wirklich brauchst.
final todosProvider = StateProvider<List<Todo>>((ref) => []);
final filterProvider = StateProvider<Filter>((ref) => Filter.all);
final filteredTodosProvider = Provider<List<Todo>>((ref) {
final todos = ref.watch(todosProvider);
switch (ref.watch(filterProvider)) {
case Filter.all:
return todos;
case Filter.completed:
return todos.where((todo) => todo.completed).toList();
case Filter.uncompleted:
return todos.where((todo) => !todo.completed).toList();
}
});
Provider sicher lesen
Das Lesen eines Providers wird niemals zu einem bad state führen. Wenn
der benötigte Code zum Auslesen eines Providers geschrieben werden kann, erhält man
einen validen Wert.
Das gilt auch für asynchron geladene Werte. Im Gegensatz
zu Providern erlaubt Riverpod eine saubere Handhabung
von Lade-/Fehlerfällen.
final configurationsProvider = FutureProvider<Configuration>((ref) async {
final uri = Uri.parse('configs.json');
final rawJson = await File.fromUri(uri).readAsString();
return Configuration.fromJson(json.decode(rawJson));
});
class Example extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final configs = ref.watch(configurationsProvider);
// Use Riverpod's built-in support
// for error/loading states using "when":
return configs.when(
loading: () => const CircularProgressIndicator(),
error: (err, stack) => Text('Error $err'),
data: (configs) => Text('data: ${configs.host}'),
);
}
}
Überprüfe deinen Zustand im Devtool
Durch die Verwendung von Riverpod ist dein Zustand direkt im Devtool von Flutter sichtbar.
Darüber hinaus ist ein vollwertiger State-Inspector in Arbeit.
