স্কিপ করে মূল কন্টেন্ট এ যাও

প্রভাইডাররা

এখন আমরা যখন Riverpod ইন্সটল করে নিয়েছি, তাহলে "প্রভাইডারগুলি" কে নিয়ে কথা বলা যাক।

প্রভাইডার হচ্ছে একটি Riverpod অ্যাপ্লিকেশনের সবচেয়ে গুরুত্বপূর্ণ অংশ। একটি প্রভাইডার এমন একটি বস্তু যা স্টেটের একটি অংশকে আবদ্ধ করে এবং শোনার অনুমতি দেয় সেই স্টেটে।

কেন ব্যবহার করবেন প্রভাইডার?

একটি স্টেট কে প্রভাইডার দিয়ে মোড়ানোর পড়, এটিঃ

  • একাধিক অবস্থানে সেই স্টেট সহজেই অ্যাক্সেস করার অনুমতি দেয়। প্রদানকারীরা সিঙ্গলটনের মতো প্যাটার্নগুলির সম্পূর্ণ প্রতিস্থাপন, সার্ভিস লোকেটার, ডিপেনডেন্সি ইনজেকশন বা ইনহেরিটেড উইজেট।

  • অন্য স্টেট এর সাথে এই স্টেটকে একত্রিত করা সহজ করে। কখনও একাধিক অবজেক্ট একত্রিত করতে সংগ্রাম করেছেন? এই দৃশ্যকল্প নির্মিত হয় একটি সহজ সিনট্যাক্স সহ সরাসরি প্রভাইডার এর ভিতরে।

  • পারফর্মেন্স অপ্টিমাইজেশান সক্ষম করে। ফিল্টারিং উইজেট পুনর্নির্মাণের (Build) জন্য হোক বা ব্যয়বহুল স্টেট কম্পিউটেশন ক্যাশ করার জন্য; প্রভাইডাররা নিশ্চিত করে যে শুধুমাত্র স্টেট পরিবর্তনের দ্বারা প্রভাবিত হয় শুধু তাই যেন পুনরায় বিল্ড হয়।

  • অ্যাপ্লিকেশন এর টেস্ট এর সক্ষমতা বৃদ্ধি করে। প্রভাইডার এর সাতেহ আপনার কমপ্লেক্স setUp/tearDown এর প্রয়োজন নেই. উপরন্তু, যেকোন প্রভাইডারকে টেস্ট এর সময় ভিন্নভাবে আচরণ করার জন্য ওভাররাইড করা যেতে পারে, যা সহজেই একটি খুব নির্দিষ্ট আচরণ টেস্ট করার অনুমতি দেয়।

  • উন্নত বৈশিষ্ট্যগুলির সাথে সহজ একীকরণের অনুমতি দেয়, যেমন লগিং বা পুল-টু-রিফ্রেশ

প্রভাইডার তৈরি করা

প্রভাইডাররা অনেকগুলি ভেরিয়েন্টে আসে, কিন্তু তারা সব একই ভাবে কাজ করে।

সর্বাধিক সাধারণ ব্যবহার হল তাদের গ্লোবালই কন্সটেন্ট হিসাবে ঘোষণা করা::

final myProvider = Provider((ref) {
return MyValue();
});
note

প্রভাইডার এর গ্লোবাল দিক দ্বারা ভীত হবেন না। প্রভাইডার সম্পূর্ণরূপে অপরিবর্তনীয়. একটি প্রভাইডার ঘোষণা, একটি ফাংশন ঘোষণা থেকে ভিন্ন নয় এবং প্রভাইডাররা টেস্টেবল এবং মেইন্টেইনেবল।

এই স্নিপেট তিনটি উপাদান নিয়ে গঠিত:

  • final myProvider, একটি ভেরিয়েবল ঘোষণা. এই ভেরিয়েবলটি আমরা ভবিষ্যতে আমাদের প্রভাইডারের স্টেট পড়তে ব্যবহার করব। এটা সবসময় অপরিবর্তনীয় (Immutable) হওয়া উচিত।

  • Provider, এই প্রভাইডারটি আমরা ব্যবহার করার সিদ্ধান্ত নিয়েছি. Provider হচ্ছে সবচেয়ে সাধারণ প্রভাইডার.এটি এমন একটি অবজেক্ট প্রকাশ করে যা কখনই পরিবর্তনশীল নয়। আমরা Provider কে StreamProvider বা এর মত অন্যান্য প্রদানকারীর সাথে প্রতিস্থাপন করতে পারি StateNotifierProvider, মানটির সাথে কীভাবে ইন্টারঅ্যাক্ট করা হয় তা পরিবর্তন করতে।

  • একটি ফাংশন যা শেয়ারড স্টেট তৈরি করে। সেই ফাংশনটি সর্বদা একটি প্যারামিটার হিসাবে ref নামক একটি বস্তু গ্রহণ করবে। এই অবজেক্ট আমাদের অন্যান্য প্রভাইডার পড়তে বা কিছু অপারেশন সঞ্চালনের অনুমতি দেয় যখন স্টেট আমাদের প্রভাইডার ধ্বংস (dispose) করা হবে.

একটি প্রভাইডার এর কাছে পাঠানো ফাংশন দ্বারা তৈরি বস্তুর ধরন নির্ভর করে যে প্রভাইডার ব্যবহৃত হয়েছে তার উপর. উদাহরণস্বরূপ, একটি Provider এর ফাংশন যেকোনো বস্তু তৈরি করতে পারে। অন্যদিকে, StreamProvider-এর কলব্যাক একটি Stream রিটার্ন দেবে বলে আশা করা যায়।

info

সীমাবদ্ধতা ছাড়াই আপনি যত খুশি তত প্রভাইডার ঘোষণা করতে পারেন। package:provider ব্যবহার করার বিপরীতে, Riverpod-এ আমাদের দুটি প্রভাইডার থাকতে পারে যা একই "টাইপ" এর একটি স্টেট প্রকাশ করেঃ

final cityProvider = Provider((ref) => 'London');
final countryProvider = Provider((ref) => 'England');

উভয় প্রভাইডার একটি String তৈরি করে যা কোনো সমস্যা সৃষ্টি করে না।

caution

For providers to work, you must add ProviderScope at the root of your Flutter applications:

প্রভাইডার গুলো কাজ করার জন্য, আপনাকে অবশ্যই আপনার ফ্লটার অ্যাপ্লিকেশন রুটে ProviderScope যোগ করতে হবেঃ

void main() {
runApp(ProviderScope(child: MyApp()));
}

স্টেট ধ্বংসের আগে কাজ সম্পাদন করা

কিছু ক্ষেত্রে, প্রভাইডারের স্টেট ধ্বংস বা পুনরায় তৈরি হতে পারে। এই পরিস্থিতিতে একটি সাধারণ ব্যবহারের ক্ষেত্র হচ্ছে একটি প্রভাইডারের স্টেট ধ্বংস হওয়ার আগে একটি এটি পরিষ্কার করা হয়, অথবা ডিসপোস করা, যেমন একটি StreamController বন্ধ করা।

এটি ref অবজেক্ট ব্যবহার করে করা হয়, যা তার onDispose মেথড বা পদ্ধতি ব্যবহার করে সমস্ত প্রভাইডারের কলব্যাকে পাঠানো হয়।

নিচের উদাহরণটি onDispose ব্যবহার করে একটি StreamController বন্ধ (Dispose) করার জন্য:

final example = StreamProvider.autoDispose((ref) {
final streamController = StreamController<int>();

ref.onDispose(() {
// StreamController বন্ধ করে দেয় যখন প্রভাইডার এর স্টেট ধ্বংস হয়ে যায়।
streamController.close();
});

return streamController.stream;
});
note

প্রভাইডার এর উপর নির্ভর করে অনেক সময় এটি নিজে নিজে ক্লিনআপ বা পরিষ্কার করে নিতে পারে, উদাহারণসরূপ, StateNotifierProvider কল করবে dispose যা StateNotifier এর একটি মেথড.

প্রভাইডার সংশোধক (মডিফায়ার)

আপনার বিভিন্ন প্রভাইডারে অতিরিক্ত কার্যকারিতা যোগ করার জন্য সমস্ত প্রভাইডারের মধ্যে একটি অন্তর্নির্মিত উপায় রয়েছে।

তারা ref অবজেক্টে নতুন বৈশিষ্ট্য যোগ করতে পারে বা প্রভাইডারের পদ্ধতিতে কিছুটা পরিবর্তন করতে পারে যে কিভাবে তা কনসীউম করা হবে।

নামযুক্ত কনস্ট্রাক্টরের অনুরূপ একটি সিনট্যাক্স সহ সমস্ত প্রভাইডারে সংশোধক ব্যবহার করা যেতে পারেঃ

final myAutoDisposeProvider = StateProvider.autoDispose<int>((ref) => 0);
final myFamilyProvider = Provider.family<String, int>((ref, id) => '$id');

এই মুহুর্তে, দুটি সংশোধক এভেইলেবেল রয়েছেঃ

  • .autoDispose, যা প্রভাইডারকে স্বয়ংক্রিয়ভাবে তার স্টেট ধ্বংস করে দেবে যখন এটি আর রিড করা হচ্ছে না।
  • .family, যা বাহ্যিক প্যারমিটার থেকে একটি প্রভাইডার তৈরি করার অনুমতি দেয়.
note

একজন প্রভাইডার একসাথে একাধিক সংশোধক ব্যবহার করতে পারেঃ

final userProvider = FutureProvider.autoDispose.family<User, int>((ref, userId) async {
return fetchUser(userId);
});

তাহলে এই গাইডটি এই পর্যন্তই!

আপনি আর জানতে পারেন কিভাবে একটি প্রভাইডার পড়তে হয়. অথবা, আপনি দেখতে পারেন কিভাবে প্রভাইডার একত্র করবেন.