লিখন প্রবাহ স্পষ্টই থাকে।

provider method হিসেবে mutations সংজ্ঞায়িত করুন, MutationToken দিয়ে state পর্যবেক্ষণ করুন, এবং ref.invoke(call) দিয়ে চালান।

Mutation-এর মূল ব্লক

একটি mutation হলো mutate(token, body, concurrency: ...) থেকে ফেরত পাওয়া Call<R, State>।

Token

late final renameMut = mutation<void>(#rename)

Execution

await ref.invoke(provider.rename(...))

State

Idle / Pending / Success / Error via ref.watch(token)

দ্রষ্টব্য

notifier.method() স্টাইলের API-এর বিপরীতে, miniriverpod mutation execution-কে first-class call object করে।

একটি mutation চালান

ref.invoke ব্যবহার করুন যাতে cancellation এবং drop আচরণ caller-এর কাছে দৃশ্যমান হয়।

চালান

সমান্তরালতার বিকল্প

concurrent : সব call parallel-এ চালান (ডিফল্ট)।
queue      : FIFO; error হলেও queued call চালিয়ে যান।
restart    : আগের রান বাতিল করুন, শুধু সর্বশেষ call রাখুন।
dropLatest : একটি চলমান থাকলে নতুন incoming call ফেলে দিন।

উদাহরণ: optimistic update + restart

একটি সাধারণ write pattern প্রথমে AsyncData-কে optimisticভাবে আপডেট করে, তারপর সার্ভার প্রতিক্রিয়ার সাথে সিঙ্ক করে।

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 পুরোনো কলারদের কাছে CancelledMutation নিক্ষেপ করতে পারে।
dropLatest ব্যস্ত থাকলে DroppedMutation নিক্ষেপ করতে পারে।
অস্থায়ী cancellation error দমন করতে চাইলে এগুলো UI-এ ধরে নিন।

পরবর্তী ধাপ

Flutter API

ConsumerWidget বা ConsumerStatefulWidget ব্যবহার করে mutation state-কে UI-তে বাঁধুন।

Flutter API খুলুন

API রেফারেন্স

invoke, mutation, mutate, এবং MutationState type দ্রুত দেখে নিন।

API রেফারেন্স খুলুন