Route — এটি কী, ফ্লাটারে রুটের প্রকার ও তৈরি

লেখক: IT Sectr প্রকাশিত: 2026-07-02 পড়ার সময়: 8 মিনিট

Route হল ফ্লাটারের একটি অ্যাবস্ট্র্যাক্ট ক্লাস যা নেভিগেটরের নেভিগেশন ইতিহাসে একটি পৃথক স্ক্রিন বা পৃষ্ঠাকে উপস্থাপন করে। Route-এর কংক্রিট বাস্তবায়ন — MaterialPageRoute, CupertinoPageRoute এবং PlatformRoute — নির্ধারণ করে যে স্ক্রিনটি কীভাবে প্রদর্শিত হবে এবং ট্রানজিশনের সময় কী অ্যানিমেশন ব্যবহার করা হবে। সাধারণ উইজেটের বিপরীতে, Route-এর নিজস্ব জীবনচক্র রয়েছে যার পদ্ধতি didPush, didPop, didReplace এবং didChangeNext। Flutter API Reference (2026) অনুসারে, প্রতিটি Route ModalBarrier পরিচালনা করে, প্ল্যাটফর্ম-নির্দিষ্ট বৈশিষ্ট্যগুলি (iOS-এ সোয়াইপ-ব্যাক) বিবেচনা করে এবং স্ক্রিনগুলির মধ্যে অবস্থার বিচ্ছিন্নতা নিশ্চিত করে।

মূল বিষয়

  • Route — ফ্লাটারে নিজস্ব জীবনচক্র (didPush, didPop, didReplace, didChangeNext) সহ একটি অ্যাবস্ট্র্যাক্ট স্ক্রিন ক্লাস
  • MaterialPageRoute — Android এবং ডেস্কটপের জন্য ম্যাটেরিয়াল অ্যানিমেশন (নিচ থেকে স্লাইড) সহ স্ট্যান্ডার্ড Route বাস্তবায়ন
  • CupertinoPageRoute — iPhone এবং iPad-এর জন্য iOS অ্যানিমেশন (ডান থেকে স্লাইড + অঙ্গভঙ্গি সোয়াইপ-ব্যাক) সহ Route বাস্তবায়ন
  • জীবনচক্র — Route ধাপগুলি অতিক্রম করে: ট্রানজিশন, সক্রিয়, নিষ্ক্রিয় এবং নিষ্পত্তি
  • ডেটা স্থানান্তর — Route কনস্ট্রাক্টরের মাধ্যমে আর্গুমেন্ট গ্রহণ করে এবং শেষ হলে Future-এর মাধ্যমে ফলাফল ফেরত দেয়

ফ্লাটারে Route কী

Route হল ফ্লাটার নেভিগেশন সিস্টেমের ভিত্তি। একটি অ্যাপ্লিকেশনে ব্যবহারকারীর দেখা প্রতিটি স্ক্রিন নেভিগেটর স্ট্যাকের মধ্যে অবস্থিত একটি Route অবজেক্ট দ্বারা উপস্থাপিত হয়। Route নিয়ন্ত্রণ কোড থেকে স্ক্রিনকে বিমূর্ত করে: নেভিগেটর Route যোগ করে এবং সরিয়ে দেয়, যখন Route-এর ভিতরে ব্যবহারকারীর দেখা ইন্টারফেস থাকে। এই আর্কিটেকচার নেভিগেশন এবং প্রদর্শনের মধ্যে দায়িত্ব পৃথক করে।

সাধারণ উইজেট প্রতিস্থাপনের বিপরীতে, Route সাধারণ উইজেটের জন্য অনুপলব্ধ পরিষেবা সরবরাহ করে: ModalBarrier (ডায়ালগ খোলা থাকলে পটভূমি ম্লান করা), প্রবেশ এবং প্রস্থান অ্যানিমেশন নিয়ন্ত্রণ, Android-এ হার্ডওয়্যার ব্যাক বাটন পরিচালনা এবং স্ক্রিনের মধ্যে মসৃণ ট্রানজিশনের জন্য হিরো অ্যানিমেশনের সাথে একীকরণ।

Flutter Cookbook (2026) অনুসারে, Route হিরো অ্যানিমেশনের জন্য একটি মূল উপাদান: একটি Route-এ হিরো উইজেট স্বয়ংক্রিয়ভাবে পরবর্তী Route-এ হিরো উইজেটে ট্রানজিশন অ্যানিমেট করে, একটি “উড়ন্ত” উপাদানের প্রভাব তৈরি করে। এটি সম্ভব কারণ Route অ্যানিমেশনের সময় ওভারলেতে উভয় স্ক্রিন রাখে।

নেভিগেশনের বিল্ডিং ব্লক হিসাবে Route

Route সরল মোবাইল অ্যাপ্লিকেশন (নেভিগেটর 1.0-এর মাধ্যমে) এবং গভীর লিঙ্ক সহ জটিল পরিস্থিতি (নেভিগেটর 2.0) উভয়ের জন্যই ভিত্তি। নেভিগেটর 2.0-এ, Route একটি পৃষ্ঠাকে উপস্থাপন করে যা RouterDelegate রুট কনফিগারেশন থেকে রূপান্তর করে। সুতরাং, যেকোনো ফ্লাটার নেভিগেশন সিস্টেমের সাথে কাজ করার জন্য Route বোঝা অপরিহার্য — নির্বাচিত পদ্ধতি বা প্যাকেজ নির্বিশেষে।

Route-এর প্রকার: MaterialPageRoute এবং CupertinoPageRoute

Flutter Route-এর বেশ কয়েকটি অন্তর্নির্মিত বাস্তবায়ন সরবরাহ করে, প্রতিটি একটি নির্দিষ্ট প্ল্যাটফর্মের সাথে আচরণ খাপ খাইয়ে নেয়। সঠিক Route প্রকার নির্বাচন ব্যবহারকারীর অভিজ্ঞতাকে প্রভাবিত করে: Android-এ ম্যাটেরিয়াল অ্যানিমেশন এবং iOS-এ Cupertino অ্যানিমেশন একটি “নেটিভ” অ্যাপ্লিকেশনের অনুভূতি তৈরি করে।

Route-এর প্রকারঅ্যানিমেশনপ্ল্যাটফর্মবৈশিষ্ট্য
MaterialPageRouteনিচ থেকে উপরে স্লাইডAndroid, ডেস্কটপট্রানজিশনে ছায়া, স্বয়ংক্রিয় SafeArea পরিচালনা
CupertinoPageRouteডান থেকে বামে স্লাইডiOS, iPadOSঅঙ্গভঙ্গি সোয়াইপ-ব্যাক, ট্রানজিশনের সময় স্বচ্ছ পটভূমি
PlatformRouteস্বয়ংক্রিয় নির্বাচনসব প্ল্যাটফর্মTargetPlatform-এর ভিত্তিতে প্রকার নির্বাচন করে
PageRouteBuilderকাস্টমসব প্ল্যাটফর্মAnimationController-এর মাধ্যমে অ্যানিমেশনের উপর পূর্ণ নিয়ন্ত্রণ

MaterialPageRoute: Android-এর মান

MaterialPageRoute সবচেয়ে বেশি ব্যবহৃত Route বাস্তবায়ন। এটি ধীরে ধীরে আবির্ভাব সহ নিচ থেকে উপরে নতুন স্ক্রিন অ্যানিমেট করে। প্রস্থান করার সময়, স্ক্রিন উপরে থেকে নিচে অ্যানিমেট হয়, তার মূল অবস্থানে ফিরে আসে। টুলবার (AppBar) এবং স্ক্রিন বডি আলাদাভাবে অ্যানিমেট হয়, একটি শ্রেণিবিন্যাস প্রভাব তৈরি করে।

CupertinoPageRoute: iOS নেভিগেশন শৈলী

CupertinoPageRoute iOS-এর UINavigationController-এর অনুকরণ করে। নতুন স্ক্রিন ডান দিক থেকে প্রবেশ করে, আগের স্ক্রিনকে ঢেকে ফেলে। মূল বৈশিষ্ট্য হল CupertinoBackGestureDetector-এর মাধ্যমে বাস্তবায়িত ইন্টারঅ্যাকটিভ সোয়াইপ-ব্যাক অঙ্গভঙ্গির জন্য সমর্থন। এই অঙ্গভঙ্গি অ্যানিমেশনের মাঝখানেও পরিচালিত হয়, যা iPhone ব্যবহারকারীদের কাছে পরিচিত প্রাকৃতিক আচরণ প্রদান করে।

Route-এর জীবনচক্র: সৃষ্টি থেকে নিষ্পত্তি

Route-এর নিজস্ব জীবনচক্র রয়েছে, যা সাধারণ StatefulWidget-এর জীবনচক্র থেকে পৃথক। এই চক্র বোঝা সঠিক ডেটা আরম্ভীকরণ, স্ট্রিম সাবস্ক্রিপশন এবং স্ক্রিন বন্ধ করার সময় সংস্থান মুক্তির জন্য প্রয়োজনীয়।

Route জীবনচক্রের ধাপ

Route জীবনচক্র চারটি প্রধান ধাপ নিয়ে গঠিত। ট্রানজিশন — Route তৈরি হয় এবং প্রবেশের সময় অ্যানিমেট হয় (didPush কল করা হয়)। সক্রিয় — Route সম্পূর্ণরূপে প্রদর্শিত হয় এবং ব্যবহারকারীর সাথে ইন্টারঅ্যাক্ট করে। নিষ্ক্রিয় — অন্য Route বর্তমানটিকে ঢেকে দেয় (ডায়ালগ, বটম শীট), কিন্তু Route স্ট্যাকে থাকে। নিষ্পত্তি — Route স্ট্যাক থেকে সরিয়ে দেওয়া হয় এবং ধ্বংস করা হয়, didPop এবং dispose কল করা হয়।

Route জীবনচক্র পদ্ধতিগুলি কাস্টম বাস্তবায়নে ওভাররাইড করা যেতে পারে। উদাহরণস্বরূপ, didPop কল করা হয় যখন Route স্ট্যাক থেকে সরানো হয় — এখানে আপনি খসড়া ডেটা সংরক্ষণ করতে পারেন। didChangeNext কল করা হয় যখন স্ট্যাকের পরবর্তী Route পরিবর্তিত হয়েছে — নেভিগেশন ইতিহাস পরিবর্তিত হলে UI আপডেট করার জন্য দরকারী।

Flutter API Route.didPop (2026) অনুসারে, Route-এর ভিতরে State-এর জীবনচক্রের সাথে Route-এর জীবনচক্রকে গুলিয়ে না ফেলা গুরুত্বপূর্ণ। Route-এর ভিতরে StatefulWidget-এর নিজস্ব initState এবং dispose রয়েছে, যা যথাক্রমে ট্রানজিশন এবং নিষ্পত্তি ধাপের সময় কল করা হয়। Route তার অভ্যন্তরীণ State-এর চেয়ে বেশি দিন বেঁচে থাকে — Route ওভারলেতে থাকে এমনকি যখন তার উইজেটগুলি অস্থায়ীভাবে অন্য Route দ্বারা লুকানো থাকে।

Route-এর মাধ্যমে স্ক্রিনের মধ্যে ডেটা স্থানান্তর

Route ইনপুট (তৈরির সময়) এবং আউটপুট (শেষ হলে) উভয় ক্ষেত্রেই ডেটা স্থানান্তরের প্রক্রিয়া সরবরাহ করে। Route-এর মাধ্যমে সঠিক ডেটা স্থানান্তর গ্লোবাল ভেরিয়েবল এবং InheritedWidget-এর প্রয়োজনীয়তা দূর করে, নেভিগেশনকে টাইপ-নিরাপদ এবং অনুমানযোগ্য করে তোলে।

নতুন স্ক্রিনে ডেটা স্থানান্তর করতে, গ্রহণকারী উইজেটের কনস্ট্রাক্টর বা Navigator.pushNamed-এ arguments প্যারামিটার ব্যবহার করুন। Route-এর ভিতরে, ডেটা RouteSettings.arguments-এর মাধ্যমে অ্যাক্সেসযোগ্য, যা Route অবজেক্টে সংরক্ষিত থাকে। এই পদ্ধতি সমস্ত Route প্রকারের জন্য কাজ করে — MaterialPageRoute, CupertinoPageRoute এবং কাস্টম বাস্তবায়ন।

ডেটা ফেরত দিতে, Navigator.pop(context, result)-এর দ্বিতীয় আর্গুমেন্ট ব্যবহার করুন। Navigator.push Future ফেরত দেয়, যা pop-এ দেওয়া মান দিয়ে পূর্ণ হয়। যদি pop আর্গুমেন্ট ছাড়া কল করা হয়, Future null দিয়ে পূর্ণ হয়। এই প্রক্রিয়াটি Android-এ startActivityForResult এবং iOS-এ কমপ্লিশন হ্যান্ডলারের অনুরূপ, তবে Dart Future-এর মাধ্যমে বাস্তবায়িত।

Route কনস্ট্রাক্টরের মাধ্যমে ডেটা স্থানান্তর

MaterialPageRoute-এর সাথে সরাসরি Navigator.push কল করার সময়, ডেটা লক্ষ্য স্ক্রিনের কনস্ট্রাক্টরের মাধ্যমে প্রেরণ করা হয়। MethodChannel ব্যবহার করা হয় না — এটি বিশুদ্ধ Dart মিথস্ক্রিয়া। এই পদ্ধতি জটিল অবজেক্টের টাইপ-নিরাপদ স্থানান্তরের জন্য পছন্দনীয়।

কাস্টম Route তৈরির উদাহরণ

আসুন নিজস্ব অ্যানিমেশন এবং ডেটা স্থানান্তর সহ একটি কাস্টম Route তৈরির উদাহরণ দেখি। PageRouteBuilder অ্যানিমেশন বক্ররেখা এবং সময়কালের উপর পূর্ণ নিয়ন্ত্রণ সহ প্রবেশ এবং প্রস্থান অ্যানিমেশন সংজ্ঞায়িত করার অনুমতি দেয়।

dart
// স্লাইড অ্যানিমেশন সহ কাস্টম Route
Navigator.push(context, PageRouteBuilder(
  pageBuilder: (context, animation, secondaryAnimation) {
    return DetailPage(productId: '42');
  },
  transitionsBuilder: (context, animation, secondaryAnimation, child) {
    const begin = Offset(0.0, 0.3);
    const end = Offset.zero;
    final tween = Tween(begin: begin, end: end);
    final offsetAnimation = animation.drive(tween);
    return SlideTransition(position: offsetAnimation, child: child);
  },
  transitionDuration: const Duration(milliseconds: 400),
));

// স্ক্রিন থেকে ডেটা ফেরত দিন
ElevatedButton(
  onPressed: () => Navigator.of(context).pop({'selected': true, 'id': '42'}),
  child: const Text('নির্বাচন করুন'),
);

// কলিং স্ক্রিনে ফলাফল পান
final result = await Navigator.push(context, MaterialPageRoute(
  builder: (context) => const SelectionPage(),
));
if (result != null) {
  print('নির্বাচিত: ${result['selected']}');
}

উদাহরণে, PageRouteBuilder স্বচ্ছতা সহ নিচ থেকে একটি কাস্টম স্লাইড অ্যানিমেশন সংজ্ঞায়িত করে। transitionDuration অ্যানিমেশনের গতি নির্ধারণ করে। কোড ফলাফল স্থানান্তরও প্রদর্শন করে: বিস্তারিত স্ক্রিন ব্যবহারকারীর নির্বাচনের সাথে একটি Map ফেরত দেয়, এবং কলিং স্ক্রিন push থেকে Future-এর মাধ্যমে এই ডেটা গ্রহণ করে। Route সম্পূর্ণ বিচ্ছিন্নতা নিশ্চিত করে: বিস্তারিত স্ক্রিনের খসড়াগুলি তালিকার অবস্থাকে প্রভাবিত করে না।

সচরাচর জিজ্ঞাসিত প্রশ্ন

ফ্লাটারে Route এবং Widget-এর মধ্যে পার্থক্য কী?

Route একটি অবজেক্ট যা নেভিগেশন স্তরে একটি স্ক্রিন পরিচালনা করে: এটি অ্যানিমেশন, ModalBarrier এবং জীবনচক্র সংরক্ষণ করে। Widget হল ইন্টারফেসের একটি অংশের বিবরণ। Route নিজের ভিতরে Widget ধারণ করে, তবে সাধারণ উইজেটের জন্য অনুপলব্ধ পরিষেবা (ওভারলে স্তর, হিরো অ্যানিমেশন) সরবরাহ করে। একটি Route যেকোনো গভীরতার উইজেটের জটিল শ্রেণিবিন্যাস ধারণ করতে পারে।

কাস্টম অ্যানিমেশন সহ Route কীভাবে তৈরি করবেন?

pageBuilder (স্ক্রিন নির্মাণ) এবং transitionsBuilder (অ্যানিমেশন সংজ্ঞা) প্যারামিটার সহ PageRouteBuilder ব্যবহার করুন। transitionsBuilder-এ, সমান্তরাল অ্যানিমেশনের জন্য animation (0.0–1.0) এবং secondaryAnimation উপলব্ধ। পূর্ণ নিয়ন্ত্রণের জন্য, Route-এর একটি উপশ্রেণী তৈরি করুন এবং buildPage, createAnimationController এবং buildTransitions ওভাররাইড করুন, যা নিম্ন-স্তরের AnimationController-এ অ্যাক্সেস দেয়।

Route-এর মধ্যে জটিল অবজেক্ট কীভাবে স্থানান্তর করবেন?

জটিল অবজেক্ট স্থানান্তর করতে, সরাসরি Navigator.push কল করার সময় লক্ষ্য স্ক্রিনের কনস্ট্রাক্টর বা pushNamed-এর সাথে arguments প্যারামিটার ব্যবহার করুন। নিশ্চিত করুন যে অবজেক্টটি সিরিয়ালাইজযোগ্য (Map, JSON বা কাস্টম ক্লাস)। ফ্লাটারে টাইপ-নিরাপদ স্থানান্তরের জন্য, freezed বা json_serializable মডেল ব্যবহার করুন যা RouteSettings-এর মাধ্যমে স্থানান্তরের সময় সঠিক ডিসিরিয়ালাইজেশন নিশ্চিত করে।

কেন Route dispose কল নাও করতে পারে?

Route.dispose কল করা হয় না যদি Route নেভিগেটর স্ট্যাকে থাকে। উদাহরণস্বরূপ, নতুন Route খোলার সময়, পুরানো Route নিষ্ক্রিয় অবস্থায় যায় কিন্তু ধ্বংস হয় না — এটি দ্রুত ফিরে আসার জন্য স্ট্যাকে থাকে। Dispose শুধুমাত্র তখন কল করা হয় যখন Route pop, pushReplacement বা pushAndRemoveUntil-এর মাধ্যমে স্ট্যাক থেকে সরানো হয়। সংস্থান মুক্ত করতে, Route-এর ভিতরে State-এর dispose ব্যবহার করুন, Route-এর নিজস্ব dispose নয়।

কীভাবে বর্তমানে কোন Route সক্রিয় তা পরীক্ষা করবেন?

BuildContext থেকে বর্তমান Route পেতে ModalRoute.of(context) ব্যবহার করুন। ModalRoute.isActive বৈশিষ্ট্য দেখায় যে Route বর্তমানে দৃশ্যমান স্ক্রিন কিনা। ModalRoute.isCurrent — true যদি Route স্ট্যাকের শীর্ষে থাকে। স্ট্যাক পরিবর্তন পর্যবেক্ষণ করতে, RouteAware এবং RouteObserver-এর মাধ্যমে নেভিগেটর পর্যবেক্ষকে সাবস্ক্রাইব করুন, যা সক্রিয় Route পরিবর্তন সম্পর্কে জানায়।

সারাংশ

  • Route — ফ্লাটারে জীবনচক্র (didPush, didPop, didReplace, didChangeNext) এবং ModalBarrier ও হিরো অ্যানিমেশন সমর্থন সহ একটি অ্যাবস্ট্র্যাক্ট স্ক্রিন ক্লাস
  • MaterialPageRoute — নিচ থেকে স্লাইড অ্যানিমেশন, ছায়া এবং স্বয়ংক্রিয় SafeArea সহ Android বাস্তবায়ন
  • CupertinoPageRoute — ডান থেকে স্লাইড অ্যানিমেশন এবং ইন্টারঅ্যাকটিভ সোয়াইপ-ব্যাক অঙ্গভঙ্গি সহ iOS বাস্তবায়ন
  • PageRouteBuilder — transitionsBuilder এবং AnimationController-এর মাধ্যমে কাস্টম অ্যানিমেশন সহ Route তৈরির ইউটিলিটি
  • ডেটা স্থানান্তর — ইনপুটে Route কনস্ট্রাক্টর (push) বা arguments (pushNamed) দ্বারা; আউটপুটে Future-সহ Navigator.pop(context, result) দ্বারা
  • জীবনচক্র — চারটি ধাপ: ট্রানজিশন (didPush), সক্রিয়, নিষ্ক্রিয় (অন্য Route দ্বারা আচ্ছাদিত), নিষ্পত্তি (didPop + dispose)
  • স্ক্রিন বিচ্ছিন্নতা — প্রতিটি Route-এর নিজস্ব BuildContext এবং অবস্থা থাকে, যা লিক প্রতিরোধ করে এবং ডেটা ব্যবস্থাপনা সহজ করে

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন