Alur penulisan tetap eksplisit.
Definisikan mutasi sebagai metode provider, pantau status dengan MutationToken, dan jalankan melalui ref.invoke(call).
Blok penyusun mutasi
Sebuah mutasi adalah Call<R, State> yang dikembalikan dari mutate(token, body, concurrency: ...).
Token
late final renameMut = mutation<void>(#rename)
Execution
await ref.invoke(provider.rename(...))
State
Idle / Pending / Success / Error via ref.watch(token)
Catatan
Berbeda dengan API bergaya notifier.method(), miniriverpod menjadikan eksekusi mutasi sebagai call object kelas satu.
Jalankan sebuah mutasi
Gunakan ref.invoke agar perilaku pembatalan dan drop terlihat oleh pemanggil.
Jalankan
Opsi konkurensi
concurrent : run all calls in parallel (default).
queue : FIFO; keep running queued calls even after an error.
restart : cancel previous run, keep only latest call.
dropLatest : drop incoming calls while one is running.
Contoh: pembaruan optimis + restart
Pola penulisan yang umum adalah memperbarui AsyncData secara optimis, lalu menyinkronkannya dengan respons server.
class UserProvider extends AsyncProvider<User?> {
UserProvider() : super.args(null);
late final renameMut = mutation<void>(#rename);
Call<void, AsyncValue<User?>> rename(String newName) => mutate(
renameMut,
(ref) async {
final cur = ref.watch(this).valueOrNull;
ref.state = AsyncData((cur ?? const User()).copyWith(name: newName), isRefreshing: true);
final api = ref.watch(apiProvider);
await api.rename(newName);
ref.state = AsyncData(await api.me());
},
concurrency: Concurrency.restart,
);
}
Langkah berikutnya
Flutter API
Hubungkan status mutasi ke UI menggunakan ConsumerWidget atau ConsumerStatefulWidget.
Buka Flutter API