Alur penulisan tetap eksplisit.
Definisikan mutation sebagai metode provider, pantau status dengan MutationToken, dan jalankan melalui ref.invoke(call).
Blok penyusun mutation
Sebuah mutation 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 mutation sebagai call object kelas utama.
Jalankan sebuah mutation
Gunakan ref.invoke agar perilaku pembatalan dan drop terlihat oleh pemanggil.
Jalankan
Opsi concurrency
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 optimistis + restart
Pola penulisan umum memperbarui AsyncData secara optimistis lalu menyinkronkan 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 mutation ke UI menggunakan ConsumerWidget atau ConsumerStatefulWidget.
Buka Flutter API