লিখন প্রবাহ স্পষ্টই থাকে।
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,
);
}
পরবর্তী ধাপ
Flutter API
ConsumerWidget বা ConsumerStatefulWidget ব্যবহার করে mutation state-কে UI-তে বাঁধুন।
Flutter API খুলুন