^0.14.0 vers ^1.0.0
Après une longue attente, la première version stable de Riverpod est enfin disponible 👏
Pour voir la liste complète des changements, consultez le Changelog.
Dans cette page, nous allons nous concentrer sur comment migrer une application existante
utilisant Riverpod version 0.14.x vers la version 1.0.0.
Utiliser l'outil de migration pour automatiquement migrer votre projet
Avant d'expliquer les différents changements, il est important de noter que Riverpod vient avec une application terminale permettant de mettre à jour votre projet pour vous.
Installer l'outil
Pour installer l'outil de migration, lancez:
dart pub global activate riverpod_cli
Vous devriez normalement ensuite pouvoir faire:
riverpod --help
Utilisation
Maintenant que la ligne de commande est installé, nous pouvons l'utiliser.
Premièrement, ouvrez votre projet dans votre terminal.
Ne pas mettre à jour Riverpod.
L'outil de migration va automatiquement changer la version de Riverpod pour vous.dangerNe pas mettre à jour Riverpod est important. L'outil ne va pas fonctionner correctement si vous avez déjà installé la version 1.0.0. Verifiez donc bien que votre projet utilise une version antérieure avant de lancer l'outil.
Assurez vous que votre projet ne contient pas d'erreurs.
Executez:
riverpod migrate
L'outil va ensuite analyser votre projet et suggérer des changements. Comme par exemple:
-Widget build(BuildContext context, ScopedReader watch) {
+Widget build(BuildContext context, Widget ref) {
- MyModel state = watch(provider);
+ MyModel state = ref.watch(provider);
}
Accept change (y = yes, n = no [default], A = yes to all, q = quit)?
Pour accepter les changements, tapez sur y. Sinon, pour le rejeter, tapez n.
Les changements
Maintenant que nous avons vu comment utiliser le terminal pour mettre à jour notre projet, voyons en detail ces changements.
Unification de syntaxe
La version 1.0.0 de Riverpod se concentre sur l'unification de la syntaxe pour
interagir avec les providers.
Avant, Riverpod avait de nombreuses syntaxes similaires mais différentes pour
lire un provider, tel que ref.watch(provider)
vs useProvider(provider)
vs watch(provider)
.
Avec la version 1.0.0, seule une syntaxe reste: ref.watch(provider)
. Les autres
sont quant-à elles supprimés.
Ce qui veut dire que:
useProvider
est remplacé parHookConsumerWidget
. Avant:class Example extends HookWidget {
Widget build(BuildContext context) {
useState(...);
int count = useProvider(counterProvider);
...
}
}Après:
class Example extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
useState(...);
int count = ref.watch(counterProvider);
...
}
}Le prototype de la méthode
build
deConsumerWidget
etConsumer
est changé. Avant:class Example extends ConsumerWidget {
Widget build(BuildContext context, ScopedReader watch) {
int count = watch(counterProvider);
...
}
}
Consumer(
builder: (context, watch, child) {
int count = watch(counterProvider);
...
}
)Après:
class Example extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
int count = ref.watch(counterProvider);
...
}
}
Consumer(
builder: (context, ref, child) {
int count = ref.watch(counterProvider);
...
}
)context.read
est remplacé parref.read
. Avant:class Example extends StatelessWidget {
Widget build(BuildContext context) {
SomeButton(
onPressed: () => context.read(provider.notifier).doSomething(),
);
}
}Après:
class Example extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
SomeButton(
onPressed: () => ref.read(provider.notifier).doSomething(),
);
}
}
StateProvider
StateProvider est aligné avec StateNotifierProvider.
Avant, faire ref.watch(StateProvider)
retournait une instance de StateController
.
Maintenant, cela retourne directement l'état du StateController
.
Pour migrer, il y a plusieurs solutions. Si votre code obtenait l'état sans le modifier, vous pouvez le changer de:
final provider = StateProvider<int>(...);
Consumer(
builder: (context, ref, child) {
StateController<int> count = ref.watch(provider);
return Text('${count.state}');
}
)
vers:
final provider = StateProvider<int>(...);
Consumer(
builder: (context, ref, child) {
int count = ref.watch(provider);
return Text('${count}');
}
)
Alternativement, vous pouvez utiliser le nouveau StateProvider.state
, qui
fonctionne comme l'ancien comportement.
final provider = StateProvider<int>(...);
Consumer(
builder: (context, ref, child) {
StateController<int> count = ref.watch(provider.state);
return Text('${count.state}');
}
)