GetX — Flutter-এর জন্য একটি হালকা মাইক্রো-ফ্রেমওয়ার্ক যা স্টেট ম্যানেজমেন্ট, ন্যাভিগেশন এবং ডিপেনডেন্সি ইনজেকশনকে একটি প্যাকেজে একত্রিত করে। আমির হোসেন আব্দোরাশিদি দ্বারা বিকশিত, GetX ন্যূনতম boilerplate অফার করে: কোনো Stream নেই, কোনো ChangeNotifier নেই, ন্যাভিগেশনের জন্য কোনো BuildContext নেই। pub.dev অনুযায়ী, GetX 13 হাজারের বেশি লাইক অর্জন করেছে, যা সবচেয়ে জনপ্রিয় Flutter প্যাকেজগুলির একটি হয়ে উঠেছে।
মূল বিষয়
GetX — Flutter-এর জন্য একটি অল-ইন-ওয়ান মাইক্রো-ফ্রেমওয়ার্ক যা তিনটি প্রধান উন্নয়ন কাজ সমাধান করে: স্টেট ম্যানেজমেন্ট, ন্যাভিগেশন (রাউটিং) এবং ডিপেনডেন্সি ইনজেকশন (DI)। GetX-এর Stream, ChangeNotifier, Builders বা সাবস্ক্রিপশনের প্রয়োজন নেই — সমস্ত রিঅ্যাকটিভিটি GetValue এবং GetStream-এর উপর ভিত্তি করে Rx র্যাপার দ্বারা সরবরাহ করা হয়, যা ChangeNotifier-এর চেয়ে দশগুণ দ্রুত কাজ করে।
GetX-কে Provider + Navigator + get_it/kiwi কম্বোর বিকল্প হিসাবে অবস্থান করা হয়েছে। তিনটি ভিন্ন প্যাকেজ ইনস্টল এবং 10 লাইন কনফিগারেশন লেখার পরিবর্তে, GetX একটি লাইন দিয়ে সবকিছু রেডি সরবরাহ করে: GetMaterialApp এর পরিবর্তে MaterialApp। ন্যাভিগেশন Get.to(NextScreen()) এর মাধ্যমে BuildContext ছাড়া কাজ করে, এবং DI Get.put(Service()) এর মাধ্যমে Provider ট্রি ছাড়া কাজ করে।
Flutter Community Survey 2025 অনুযায়ী, GetX 43% Flutter প্রকল্পে ব্যবহৃত হয়। এটি নির্বাচনের প্রধান কারণ: ন্যূনতম প্রবেশ সীমা (শিখতে 5 মিনিট), কোনো boilerplate নেই (Provider বা BLoC-এর তুলনায় কোড 60-70% হ্রাস পায়), এবং দ্রুত MVP উন্নয়ন। সমালোচকরা দায়িত্ব পৃথকীকরণ নীতি লঙ্ঘন এবং ডিবাগিং জটিলতা উল্লেখ করেন।
Obx — একটি রিঅ্যাকটিভ GetX উইজেট যা Rx ভেরিয়েবল পরিবর্তন হলে পুনর্নির্মাণ করে। Obx-এর সাবস্ক্রিপশন, dispose বা Builder ফাংশনের প্রয়োজন নেই — শুধু উইজেটটিকে Obx-এ র্যাপ করুন এবং ভিতরে Rx ভেরিয়েবল ব্যবহার করুন। Obx স্বয়ংক্রিয়ভাবে ট্র্যাক করে কোন Rx ভেরিয়েবল ব্যবহার করা হচ্ছে এবং শুধুমাত্র সেগুলি পরিবর্তন হলে পুনরায় আঁকে।
class CounterController extends GetxController {
final count = 0.obs;
void increment() => count++;
}
class CounterScreen extends StatelessWidget {
final controller = Get.put(CounterController());
@override
Widget build(context) => Obx(() => Text('${controller.count}'));
}Rx ভেরিয়েবল: .obs — একটি গেটার যা যেকোনো মানকে Rx অবজেক্টে র্যাপ করে। GetX টাইপকৃত Rx ক্লাস সরবরাহ করে: RxInt, RxString, RxDouble, RxBool, RxList, RxMap। সমস্ত Rx ভেরিয়েবল সাধারণ প্রিমিটিভের মতো আচরণ করে: count++, name.value = 'Hello', items.add(item)। পরিবর্তন স্বয়ংক্রিয়ভাবে Obx সাবস্ক্রাইবারদের জানায়।
GetBuilder — Rx ছাড়া Obx-এর একটি বিকল্প, ম্যানুয়াল update() কলের মাধ্যমে কাজ করে। GetBuilder.filter — ID কী দ্বারা টার্গেটেড আপডেটের জন্য। Obx দ্রুততর (স্বয়ংক্রিয় ডিপেনডেন্সি ট্র্যাকিং), GetBuilder বেশি অনুমানযোগ্য (স্পষ্ট আপডেট কল)। সাধারণ পরিস্থিতির জন্য Obx এবং অনেক ডিপেনডেন্সি সহ জটিল উইজেটের জন্য GetBuilder সুপারিশ করা হয়।
GetxController — লাইফসাইকেল সমর্থন সহ বিজনেস লজিকের জন্য একটি বেস ক্লাস। GetxController-এর মেথড রয়েছে: onInit() (ইনিশিয়ালাইজেশন), onReady() (প্রথম ফ্রেমের পরে), onClose() (রিসোর্স ক্লিনআপ)। ChangeNotifier এবং StateNotifier-এর বিপরীতে, GetxController স্বয়ংক্রিয়ভাবে সাবস্ক্রিপশন পরিচালনা করে: পেজ ধ্বংস হলে, সমস্ত Rx ভেরিয়েবল এবং Workers আনসাবস্ক্রাইব হয়ে যায়।
class AuthController extends GetxController {
final user = Rx<User?>(null);
final isLoading = false.obs;
@override
void onInit() {
ever(isLoading, (_) => print('Loading: $isLoading'));
super.onInit();
}
Future<void> login(String email, String password) async {
isLoading.value = true;
user.value = await api.login(email, password);
isLoading.value = false;
}
}Workers — রিঅ্যাকটিভ GetX ইউটিলিটি: ever (প্রতি পরিবর্তনে কল), once (শুধুমাত্র প্রথম পরিবর্তনে), debounce (বিলম্ব সহ), interval (প্রতি সেকেন্ডে N বারের বেশি নয়)। Workers সাধারণ কাজগুলি সমাধান করে: ফিল্ড ভ্যালিডেশন (debounce), অ্যানালিটিক্স (once), সিঙ্ক্রোনাইজেশন (ever)। Workers onClose() কল করলে স্বয়ংক্রিয়ভাবে আনসাবস্ক্রাইব হয়, মেমরি লিক প্রতিরোধ করে।
GetX ন্যাভিগেশন স্ক্রিনের মধ্যে স্থানান্তরের জন্য BuildContext প্রয়োজন হয় না। Navigator.push(context, MaterialPageRoute(...)) এর পরিবর্তে, Get.to(NextScreen()) ব্যবহার করা হয় — যেকোনো জায়গা থেকে কলযোগ্য, যার মধ্যে BuildContext অ্যাক্সেস ছাড়া Controller-ও অন্তর্ভুক্ত। GetX নামকৃত রুট, অ্যানিমেশন, মিডলওয়্যার এবং MaterialPageRoute ছাড়া আর্গুমেন্ট পাসিং সমর্থন করে।
// সাধারণ ন্যাভিগেশন
Get.to(ProfileScreen());
Get.back();
Get.off(LoginScreen()); // বর্তমান রুট প্রতিস্থাপন
Get.offAll(HomeScreen()); // স্ট্যাক সাফ করুন
// নামকৃত রুট
Get.toNamed('/profile', arguments: 'user123');
Get.offNamed('/login');
// মিডলওয়্যার
GetPage(
name: '/profile',
page: () => ProfileScreen(),
middlewares: [AuthMiddleware()],
)GetPage এবং GetPages: GetX MaterialApp-এ routes-এর পরিবর্তে GetPages ব্যবহার করে। Middleware — স্ক্রিনে প্রবেশের আগে অথেনটিকেশন চেক, রিডাইরেক্ট, অ্যানালিটিক্স। Transition — বিল্ট-ইন ট্রানজিশন অ্যানিমেশন: fadeIn, zoom, leftToRight, topToBottom। Bindings — একটি ক্লাস যা রুটে প্রবেশ করার সময় Controller এবং ডিপেনডেন্সি ইনিশিয়ালাইজ করে। Bindings লেজি ইনিশিয়ালাইজেশন সমস্যা সমাধান করে: Controller শুধুমাত্র স্ক্রিন খোলা হলে তৈরি হয়।
Get.put — DI কন্টেইনারে একটি ইনস্ট্যান্স রেজিস্টার করে। Get.find — কন্টেইনার থেকে একটি ইনস্ট্যান্স retrieves করে। Get.lazyPut — লেজি ইনিশিয়ালাইজেশন (প্রথম find কল-এ তৈরি)। Get.putAsync — অ্যাসিঙ্ক্রোনাস ইনিশিয়ালাইজেশন (init সহ সার্ভিসের জন্য)। Get.delete — কন্টেইনার থেকে সরিয়ে দেয় (রুট ধ্বংস হলে Bindings দ্বারা স্বয়ংক্রিয়ভাবে কল হয়)।
| মেথড | কখন তৈরি হয় | কখন সরানো হয় |
|---|---|---|
| Get.put | অবিলম্বে | Get.delete বা onClose |
| Get.lazyPut | প্রথম find-এ | Get.delete বা onClose |
| Get.putAsync | Future সম্পূর্ণ হওয়ার পরে | Get.delete বা onClose |
| Get.create | প্রতি find-এ (নতুন ফ্যাক্টরি) | না |
GetX DI — Flutter-এ সবচেয়ে সহজ DI কন্টেইনার। কোনো Provider ট্রি নেই, কোনো Module নেই, কোনো Scope নেই। Get.put(Repository()) Controller বা main.dart-এ অবজেক্টটিকে Get.find<Repository>() এর মাধ্যমে অ্যাপের যেকোনো জায়গায় অ্যাক্সেসযোগ্য করে তোলে। GetX DI ট্যাগিং (tag: 'api') এবং স্থায়ীত্ব (permanent: true) কে মুছে ফেলা প্রতিরোধ করতে সমর্থন করে।
GetX পারফরম্যান্স Rx র্যাপারের উপর ভিত্তি করে যা GetStream-এর মাধ্যমে কাজ করে — Flutter-এর জন্য অপ্টিমাইজ করা একটি কাস্টম Stream বাস্তবায়ন। GetX বেঞ্চমার্ক অনুযায়ী, Rx ভেরিয়েবলগুলি ঘন ঘন আপডেটের (30+ fps) সাথে ChangeNotifier-এর চেয়ে 2-3 গুণ দ্রুত এবং BLoC-এর চেয়ে 5-7 গুণ দ্রুত। GetX সাবস্ক্রিপশনের জন্য BuildContext ব্যবহার করে না, যা ন্যাভিগেশনের সময় উইজেট ট্রি পুনর্নির্মাণ দূর করে।
সেরা অনুশীলন: অনেক চাইল্ড এলিমেন্ট (লিস্ট, টেবিল) সহ উইজেটের জন্য Obx-এর পরিবর্তে GetBuilder ব্যবহার করুন। প্রতি পৃষ্ঠায় একটি বিশাল Controller-এর পরিবর্তে Controller-কে কার্যকরী মডিউল দ্বারা বিভক্ত করুন। Controller ইনিশিয়ালাইজেশনের জন্য build মেথডে Get.put-এর পরিবর্তে Bindings ব্যবহার করুন। GetView — Get.find ছাড়া controller এর মাধ্যমে Controller অ্যাক্সেস সহ একটি সংক্ষিপ্ত StatelessWidget।
জ্ঞাত সীমাবদ্ধতা: GetX গ্লোবাল ভেরিয়েবল (Get.find, Get.to) ব্যবহার করে, যা টেস্টিং জটিল করে তুলতে পারে। GetX-এর মাধ্যমে ডিপেনডেন্সি মক করতে টেস্টের মধ্যে Get.replace() বা Get.reset() প্রয়োজন। আইসোলেশনের জন্য, Get.testMode = true সুপারিশ করা হয়। GetX এমন অ্যাপ্লিকেশনের জন্য সুপারিশ করা হয় না যার জন্য স্পষ্ট লেয়ার সীমানা সহ কঠোর আর্কিটেকচার প্রয়োজন — এই ক্ষেত্রে, কোড জেনারেশন সহ BLoC বা Riverpod পছন্দনীয়।
সচরাচর জিজ্ঞাসিত প্রশ্ন
GetX — নিজস্ব DI, ন্যাভিগেশন এবং Rx রিঅ্যাকটিভিটি সহ একটি মাইক্রো-ফ্রেমওয়ার্ক। Provider — শুধুমাত্র ChangeNotifier এবং InheritedWidget-এর মাধ্যমে স্টেট ম্যানেজমেন্ট। GetX-এর BuildContext প্রয়োজন হয় না, বিল্ট-ইন ন্যাভিগেশন এবং DI রয়েছে, boilerplate 60-70% কমায়। Provider স্ট্যান্ডার্ড Flutter Navigator ব্যবহার করে এবং DI-এর জন্য থার্ড-পার্টি সমাধান প্রয়োজন। GetX উন্নয়নে দ্রুততর, Provider নেটিভ Flutter API-এর কাছাকাছি।
Workers — Rx ভেরিয়েবল পরিবর্তনের রিঅ্যাকটিভ প্রসেসিংয়ের জন্য ইউটিলিটি। ever — প্রতি পরিবর্তনে কলব্যাক, once — শুধুমাত্র প্রথম পরিবর্তনে, debounce — বিলম্ব সহ (সার্চ ফিল্ডের জন্য), interval — N বারের বেশি নয় (অ্যানালিটিক্সের জন্য)। Workers GetxController-এর onInit()-এ ঘোষণা করা হয় এবং onClose()-এ স্বয়ংক্রিয়ভাবে আনসাবস্ক্রাইব হয়। এটি ChangeNotifier-এর সাথে ম্যানুয়াল addListener/removeListener প্রতিস্থাপন করে।
GetX টেস্ট মোড সক্ষম করতে Get.testMode = true সরবরাহ করে। ডিপেনডেন্সি Get.replace<Service>(mockService) এর মাধ্যমে প্রতিস্থাপিত হয়। টেস্টের মধ্যে, DI কন্টেইনার পরিষ্কার করতে Get.reset() কল করা হয়। Controller সরাসরি Flutter ছাড়া টেস্ট করা হয়: final c = CounterController(); c.increment(); expect(c.count.value, 1)। Obx সহ উইজেটের জন্য, InjectMocker-এর সাথে tester.pumpWidget ব্যবহার করুন।
GetX যেকোনো আকারের প্রকল্পের জন্য উপযুক্ত কিন্তু শৃঙ্খলা প্রয়োজন। বড় প্রকল্পের জন্য (10+ স্ক্রিন), ব্যবহার করুন: Controller বিচ্ছিন্নতার জন্য Bindings, প্রতি ফিচারে GetPages ফাইল হিসাবে মডিউল, build-এ ম্যানুয়াল Get.find-এর পরিবর্তে GetView। প্রধান ঝুঁকি হল গ্লোবাল অ্যাক্সেসের অপব্যবহার (যেকোনো জায়গায় Get.find)। কঠোর কোড রিভিউ এবং আর্কিটেকচারাল গাইড এটি সমাধান করে। লক্ষ লক্ষ ব্যবহারকারী সহ অনেক প্রোডাকশন অ্যাপ্লিকেশন GetX-এ চলে।
Bindings — একটি ক্লাস যা একটি রুটকে তার ডিপেনডেন্সির সাথে সংযুক্ত করে। স্ক্রিনে প্রবেশ করার সময়, Binding Get.lazyPut-এর মাধ্যমে Controller এবং সার্ভিস তৈরি করে এবং প্রস্থানের সময় সেগুলি সরিয়ে দেয়। Bindings লেজি ইনিশিয়ালাইজেশন বাস্তবায়ন করে: স্ক্রিন খোলা না হওয়া পর্যন্ত Controller মেমরিতে থাকে না। এটি RAM এবং অ্যাপ স্টার্টআপ সময় বাঁচায়। GetPage-এ ঘোষণা করা হয়: GetPage(name: '/profile', page: () => ProfileScreen(), binding: ProfileBinding())।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন