Salta al contenuto principale
Compilazione sicura

Compilazione sicura

Non più ProviderNotFoundException o dimenticarsi di gestire il caricamento degli stati. Usando Riverpod, se il codice compila, funziona.

Provider, senza le sue limitazioni

Provider, senza le sue limitazioni

Riverpod si ispira a Provider ma risolve alcuni dei suoi problemi chiave come supportare più provider dello stesso tipo; attendere provider asincroni; aggiungere provider da qualsiasi punto, ...

Non dipende da Flutter

Non dipende da Flutter

Crea/condividi/testa i provider senza dipendere da Flutter. Questo include la possibilità di ascoltare i provider senza un BuildContext.

Dichiarare uno stato condiviso da qualsiasi punto

Non c'è più bisogno di saltare tra il tuo main.dart e i file di UI. Scrivi il codice del tuo stato condiviso dove appartiene, che sia in un package separato o proprio accanto al Widget che ne ha bisogno, senza perdere la testabilità.

// 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 {
@override
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(countProvider);
return Text('$count');
}
}

Ricalcola stati/UI rebuilds solo quando necessario

Non dobbiamo più ordinare/filtrare gli elenchi all'interno del metodo build o dover ricorrere ad un meccanismo di cache avanzato.

. Con Provider e "families", ordina gli elenchi o effettua richieste HTTP solo quando ne hai veramente bisogno.

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();
}
});

Leggere in modo sicuro i provider

Leggere un provider non comporterà mai uno stato sbagliato. Se scrivi il codice necessario per leggere un provider, otterrai un valore valido.

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 {
@override
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}'),
);
}
}

Ispeziona lo stato nel devtool

Usando Riverpod, il tuo stato è visibile fuori dallo schermo all'interno dello strumento di sviluppo di Flutter (devtool).
Inoltre, è in fase di sviluppo uno strumento completo di ispezione e modifica dello stato.

Ispeziona lo stato nel devtool