Generic Type Parameter - T আসলে কী?


T
এখানে একটা Generic Type Parameter।
মানে, এটা একটা প্লেসহোল্ডার যেটা তুমি যখন মেথড কল করবে তখন সেটার জায়গায় যে টাইপ দিবে, সেটা দিয়ে মেথডটা কাজ করবে।
উদাহরণ:
static Future<T> runAsyncTask<T>(
BuildContext context,
Future<T> Function() task,
) async {
try {
show(context);
return await task();
} finally {
hide(context);
}
}
এখানে T
যেকোনো টাইপ হতে পারে:
যদি
task()
bool
রিটার্ন করে, তাহলেT
হবেbool
।যদি
task()
String
রিটার্ন করে, তাহলেT
হবেString
।যদি
task()
void
রিটার্ন করে, তাহলেT
হবেvoid
।
কেন ব্যবহার করবো?
Generic ব্যবহার করলে তোমার মেথড flexible হয়ে যায়।
আগে তুমি লিখেছিলে:
static Future<void> runAsyncTask(...)
এতে শুধু Future<void>
রিটার্ন করা যাবে — মানে কোনো ভ্যালু ফেরত পাঠানো যাবে না।
কিন্তু Generic দিয়ে লিখলে:
static Future<T> runAsyncTask<T>(...)
তুমি চাইলে রিটার্ন করতে পারবে:
Future<bool>
(যেমন OTP সফল হল কি না)Future<int>
(যেমন ডাউনলোড হওয়া ফাইলের সাইজ)Future<MyModel>
(যেমন সার্ভার থেকে পাওয়া ডাটা)
এতে কোড অনেক reusable হয়।
রান টাইমে কী হয়?
ডার্টে Generic হচ্ছে compile-time type safety এর জন্য।
যখন তুমি কল করো:
runAsyncTask<bool>(context, () async {
return true;
});
তখন ডার্ট কম্পাইলার জানে যে T
এখানে bool
হবে,
এবং task()
অবশ্যই bool
রিটার্ন করতে হবে, নইলে কম্পাইল টাইমেই এরর দিবে।
তুমি কেন এটা ব্যবহার করবে এখানে
তুমি sendOTP()
থেকে এখন bool
রিটার্ন করতে চাও (OTP গেছে কি না চেক করার জন্য),
তাহলে runAsyncTask
যদি Generic হয়, এটা bool
সেইফলি রিটার্ন করতে পারবে এবং তোমার .then((isSent) { ... })
এর মধ্যে সরাসরি সেই ভ্যালু পাবে।
সংক্ষেপে,T
মানে একটা placeholder টাইপ, যেটা তুমি মেথড কল করার সময় ঠিক করে দিবে, আর মেথড সেটা ব্যবহার করে সেই টাইপে রেজাল্ট রিটার্ন করবে।
এতে তোমার মেথড অনেক বেশি flexible ও reusable হয়।
আমি চাইলে তোমাকে একদম রিয়েল কোড ফ্লো দিয়ে দেখাতে পারি কিভাবে sendOTP
+ runAsyncTask<T>
একসাথে কাজ করবে OTP নেভিগেশনের সাথে।
তুমি কি চাইছো আমি সেটা বানিয়ে দিই?
Subscribe to my newsletter
Read articles from Rifat Hossain directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
