Riverpod für die Zustandsverwaltung
Erkunden Sie Riverpod, eine robuste und testbare Bibliothek zur Zustandsverwaltung, und verstehen Sie ihre Vorteile gegenüber anderen Lösungen für komplexe Apps.
Riverpod für die Zustandsverwaltung ist eine kostenlose Flutter Mobile Development-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Flutter Mobile Development-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Flutter Mobile Development-Kurs umfasst insgesamt 4 Lektionen.
Teile dieser Lektion wurden noch nicht übersetzt und werden auf Englisch angezeigt.
Welcome to Riverpod!
Riverpod is a popular state management library for Flutter that aims to be simple, robust, and testable. It's a reimagined version of the Provider package, designed to address some of its limitations.
Think of Riverpod as a powerful toolkit for managing all the data in your app, from user settings to fetched data, in a safe and predictable way.
Riverpod's Core Strengths
Riverpod offers several key advantages:
- Compile-time Safety: Catches errors early, before your app even runs.
- Testability: Makes it easy to test your business logic in isolation.
- Auto-Dispose: Providers can automatically clean up resources when no longer needed.
- No Widget Tree Dependency: Providers don't rely on the widget tree, making them more flexible.
It helps you write cleaner, more maintainable code.
Setting Up Your App
To use Riverpod, first add the flutter_riverpod package to your pubspec.yaml. Then, wrap your entire application with a ProviderScope widget. This widget stores the state of all your providers.
Here's how to set it up:
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
void main() {
runApp(
// Wrap your app in a ProviderScope
ProviderScope(
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Text('Hello Riverpod'),
);
}
}Introducing Providers
Providers are the core building blocks of Riverpod. They hold a piece of state and allow you to access it from anywhere in your app.
The simplest provider is a Provider, which holds an immutable value. You define it globally, making it accessible throughout your application.
import 'package:flutter_riverpod/flutter_riverpod.dart';
// A simple Provider that holds an immutable string.
final greetingProvider = Provider<String>((ref) {
return 'Hello from Riverpod!';
});
// You can also provide numbers, objects, etc.
final counterProvider = Provider<int>((ref) => 0);Consuming Providers with `ConsumerWidget`
To read a provider's value in your UI, you use a ConsumerWidget. This widget gives you access to a WidgetRef (often named ref), which lets you 'watch' or 'read' providers.
ref.watch() makes your widget rebuild when the provider's value changes.
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
final greetingProvider = Provider<String>((ref) {
return 'Hello Riverpod User!';
});
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ConsumerWidget(
builder: (context, ref, child) {
final greeting = ref.watch(greetingProvider);
return Scaffold(
appBar: AppBar(title: Text('Riverpod App')),
body: Center(child: Text(greeting)),
);
},
),
);
}
}Mutable State with `StateProvider`
When you need to change a piece of state directly, use a StateProvider. It exposes a StateController, which has a state property you can modify.
This is perfect for simple UI states like a toggle or a counter.
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// A StateProvider for a simple counter.
final counterProvider = StateProvider<int>((ref) => 0);
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ConsumerWidget(
builder: (context, ref, child) {
final count = ref.watch(counterProvider);
return Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: Text(
'Count: $count',
style: TextStyle(fontSize: 24),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
child: Icon(Icons.add),
),
);
},
),
);
}
}`StateNotifierProvider` for Logic
For more complex state that involves business logic (e.g., fetching data, managing lists), you'll use a StateNotifier with StateNotifierProvider.
StateNotifier is a class you extend, and it holds your state. The provider then exposes an instance of your notifier.
import 'package:flutter_riverpod/flutter_riverpod.dart';
// 1. Define your state class (immutable recommended)
class Todo {
final String id;
final String description;
final bool completed;
Todo(this.id, this.description, this.completed);
}
// 2. Create a StateNotifier to manage the state
class TodosNotifier extends StateNotifier<List<Todo>> {
TodosNotifier() : super([]); // Initial state is an empty list
void addTodo(String description) {
state = [...state, Todo(DateTime.now().toString(), description, false)];
}
void toggle(String id) {
state = [
for (final todo in state)
if (todo.id == id)
Todo(todo.id, todo.description, !todo.completed)
else
todo,
];
}
}
// 3. Create the StateNotifierProvider
final todosProvider = StateNotifierProvider<TodosNotifier, List<Todo>>((ref) {
return TodosNotifier();
});Async Data with `FutureProvider`
Riverpod makes handling asynchronous data (like network requests) a breeze with FutureProvider and StreamProvider.
A FutureProvider exposes an AsyncValue, which gracefully handles loading, error, and data states in your UI.
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// A FutureProvider that simulates fetching data.
final userProvider = FutureProvider<String>((ref) async {
await Future.delayed(Duration(seconds: 2)); // Simulate network delay
return 'John Doe';
});
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: ConsumerWidget(
builder: (context, ref, child) {
final userAsyncValue = ref.watch(userProvider);
return Scaffold(
appBar: AppBar(title: Text('Async Data')),
body: Center(
child: userAsyncValue.when(
loading: () => CircularProgressIndicator(),
error: (err, stack) => Text('Error: $err'),
data: (user) => Text('User: $user', style: TextStyle(fontSize: 24)),
),
),
);
},
),
);
}
}`ref.read` vs `ref.watch`
When interacting with providers, you'll primarily use two methods on the ref object:
ref.watch(provider): Listens to changes in a provider. If the provider's state changes, the widget or provider watching it will rebuild/re-execute. Use this inbuildmethods.ref.read(provider): Reads a provider's current value once, without listening for future changes. Ideal for one-off actions, like button presses or initial setup.
Avoid ref.read in build methods unless you specifically don't want rebuilds.
Riverpod Provider Types
Which Riverpod provider types are best suited for managing a simple counter (a single integer that can be incremented/decremented) and for handling complex business logic with multiple actions (e.g., adding/removing items from a to-do list)?
Riverpod Recap
Great job! You've explored Riverpod, a powerful and modern state management solution for Flutter.
- We learned about
ProviderScopefor app setup. - We used
Providerfor immutable data andStateProviderfor simple mutable state. - For complex logic,
StateNotifierProviderwithStateNotifieris key. FutureProviderhelps manage async data gracefully.- Remember
ref.watchfor listening andref.readfor one-time access.
Riverpod's compile-time safety and testability make it an excellent choice for robust Flutter applications!
Häufig gestellte Fragen
Ist die Lektion „Riverpod für die Zustandsverwaltung“ kostenlos?
Ja — der vollständige Text von „Riverpod für die Zustandsverwaltung“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Flutter Mobile Development-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Flutter Mobile Development-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Riverpod für die Zustandsverwaltung“?
Erkunden Sie Riverpod, eine robuste und testbare Bibliothek zur Zustandsverwaltung, und verstehen Sie ihre Vorteile gegenüber anderen Lösungen für komplexe Apps. Du übst Flutter Mobile Development mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Flutter Mobile Development zu starten?
Keine Vorkenntnisse erforderlich. Flutter Mobile Development auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Riverpod für die Zustandsverwaltung“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Flutter Mobile Development-Lektion Code schreiben und ausführen?
Ja. Jede Flutter Mobile Development-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- setState und InheritedWidget
- Grundlagen des Provider-Pakets
- Riverpod für die Zustandsverwaltung
- Das BLoC-Pattern mit Streams