write flow ยังคงชัดเจน.

กำหนด mutation เป็นเมธอดของ provider, เฝ้าดู state ด้วย MutationToken และ execute ผ่าน ref.invoke(call).

องค์ประกอบของ mutation

mutation คือ Call<R, State> ที่ได้จาก 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)

注意

ต่างจาก API แบบ notifier.method(), miniriverpod ทำให้ mutation execution เป็น call object ชั้นหนึ่ง.

execute mutation

ใช้ ref.invoke เพื่อให้พฤติกรรมการยกเลิกและการทิ้งงานแสดงต่อ caller.

รัน

ตัวเลือก 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.

ตัวอย่าง: optimistic update + restart

รูปแบบการเขียนที่พบได้บ่อยจะอัปเดต AsyncData แบบ optimistic ก่อน แล้วค่อยซิงก์กับ response ของเซิร์ฟเวอร์.

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,
  );
}
restart อาจ throw CancelledMutation ไปยังผู้เรียกเก่ากว่าได้.
dropLatest อาจ throw DroppedMutation ในขณะกำลังทำงานอยู่.
จับสิ่งเหล่านี้ใน UI เมื่อคุณต้องการระงับข้อผิดพลาดการยกเลิกชั่วคราว.

ขั้นตอนถัดไป

Flutter API

เชื่อม state ของ mutation กับ UI โดยใช้ ConsumerWidget หรือ ConsumerStatefulWidget.

เปิด Flutter API

API Reference

ทบทวนชนิด invoke, mutation, mutate และ MutationState อย่างรวดเร็ว.

เปิด API Reference