FutureProvider
FutureProvider
হল Provider এর সমতুল্য কিন্তু অ্যাসিঙ্ক্রোনাস কোডের জন্য।
FutureProvider
সাধারণত এর জন্য ব্যবহৃত হয়:
- অ্যাসিঙ্ক্রোনাস ক্রিয়াকলাপ সম্পাদন করা এবং ক্যাশে করা (যেমন নেটওয়ার্ক রিকুয়েস্ট)
- অ্যাসিঙ্ক্রোনাস অপারেশনের ত্রুটি/লোডিং অবস্থা সুন্দরভাবে পরিচালনা করা
- একাধিক অ্যাসিঙ্ক্রোনাস ভ্যালুকে অন্য ভ্যালুর সাথে একত্রিত করা
ref.watch এর সাথে মিলিত হলে FutureProvider
অনেক লাভ করে। এই সংমিশ্রণটি কিছু ভেরিয়েবল পরিবর্তন হলে কিছু ডেটা স্বয়ংক্রিয়ভাবে পুনঃ-আনয়নের/ফেচের অনুমতি দেয়, এটি নিশ্চিত করে যে আমাদের সর্বদা সর্বাধিক আপ-টু-ডেট ভ্যালু রয়েছে।
FutureProvider
ব্যবহারকারীর ইন্টারঅ্যাকশনের পরে গণনাকে সরাসরি পরিবর্তন করার উপায় অফার করে না। এটি সাধারণ ব্যবহারের ক্ষেত্রে সমাধান করার জন্য ডিজাইন করা হয়েছে। আরও উন্নত পরিস্থিতির জন্য, StateNotifierProvider ব্যবহার করার কথা বিবেচনা করুন।
ব্যবহারের উদাহরণ: একটি কনফিগারেশন ফাইল পড়া
FutureProvider
একটি JSON ফাইল পড়ার মাধ্যমে তৈরি করা Configuration
অবজেক্টকে প্রকাশ করার একটি সুবিধাজনক উপায় হতে পারে।
কনফিগারেশন তৈরি করা আপনার সাধারণ async/await সিনট্যাক্স দিয়ে করা হবে, কিন্তু প্রভাইডারের ভিতরে। Flutter এর Asset সিস্টেম ব্যবহার করে, এটি হবে:
- riverpod_generator
- riverpod
Future<Configuration> fetchConfiguration(Ref ref) async {
final content = json.decode(
await rootBundle.loadString('assets/configurations.json'),
) as Map<String, Object?>;
return Configuration.fromJson(content);
}
final configProvider = FutureProvider<Configuration>((ref) async {
final content = json.decode(
await rootBundle.loadString('assets/configurations.json'),
) as Map<String, Object?>;
return Configuration.fromJson(content);
});
তারপরে, UI এর মতো কনফিগারেশন রিড করতে পারেঃ
- riverpod_generator
- riverpod_generator + flutter_hooks
- riverpod
- riverpod + flutter_hooks
Widget build(BuildContext context, WidgetRef ref) {
final config = ref.watch(fetchConfigurationProvider);
return switch (config) {
AsyncError(:final error) => Text('Error: $error'),
AsyncData(:final value) => Text(value.host),
_ => const CircularProgressIndicator(),
};
}
class MyConfiguration extends HookConsumerWidget {
const MyConfiguration({super.key});
Widget build(BuildContext context, WidgetRef ref) {
final config = ref.watch(fetchConfigurationProvider);
return Scaffold(
body: switch (config) {
AsyncError(:final error) => Center(child: Text('Error: $error')),
AsyncData(:final value) => Center(child: Text(value.host)),
_ => const Center(child: CircularProgressIndicator()),
},
);
}
}
Widget build(BuildContext context, WidgetRef ref) {
AsyncValue<Configuration> config = ref.watch(configProvider);
return switch (config) {
AsyncData(:final value) => Text(value.host),
AsyncError(:final error) => Text('Error: $error'),
_ => const CircularProgressIndicator(),
};
}
class MyConfiguration extends HookConsumerWidget {
const MyConfiguration({super.key});
Widget build(BuildContext context, WidgetRef ref) {
final config = ref.watch(configProvider);
return Scaffold(
body: switch (config) {
AsyncError(:final error) => Center(child: Text('Error: $error')),
AsyncData(:final value) => Center(child: Text(value.host)),
_ => const Center(child: CircularProgressIndicator()),
},
);
}
}
Future সম্পূর্ণ হলে এটি স্বয়ংক্রিয়ভাবে UI পুনর্নির্মাণ করবে। একই সময়ে, যদি একাধিক উইজেট কনফিগারেশন চায়, Asset শুধুমাত্র একবার ডিকোড করা হবে.
আপনি দেখতে পাচ্ছেন, একটি উইজেটের ভিতরে একটি FutureProvider
শোনার ফলে রিটার্ন আসে
একটি AsyncValue - যা ত্রুটি/লোডিং অবস্থাগুলি পরিচালনা করার অনুমতি দেয়।