Route — је апстрактна класа у Flutter-у која представља засебан екран или страницу у историји навигације Navigator-а. Конкретне имплементације Route — MaterialPageRoute, CupertinoPageRoute и PlatformRoute — одређују како се екран приказује и која се анимација користи при прелазу. За разлику од обичног виџета, Route има сопствени животни циклус са методама didPush, didPop, didReplace и didChangeNext. Према Flutter API Reference (2026), сваки Route управља ModalBarrier-ом, узима у обзир платформске карактеристике (превлачење уназад на iOS-у) и обезбеђује изолацију стања између екрана.
Главно
Route — је основа навигационог система Flutter-а. Сваки екран који корисник види у апликацији представљен је објектом Route који се налази у стек-у Navigator-а. Route апстрахује екран од управљачког кода: Navigator додаје и уклања Route, а унутар Route-а се налази интерфејс који корисник види. Ова архитектура раздваја одговорност између навигације и приказа.
За разлику од једноставне замене виџета, Route пружа услуге недоступне обичним виџетима: ModalBarrier (затамњење позадине при отварању дијалога), управљање анимацијом уласка и изласка, обрада хардверског дугмета „Назад“ на Android-у и интеграција са Hero анимацијом за глатке прелазе између екрана.
Према Flutter Cookbook (2026), Route је кључни елемент за Hero анимацију: Hero виџет на једном Route-у аутоматски анимира прелаз ка Hero виџету на следећем Route-у, стварајући ефекат „летећег“ елемента. Ово је могуће управо зато што Route чува оба екрана у Overlay-у током анимације.
Route је основа како за једноставне мобилне апликације (преко Navigator 1.0), тако и за сложене сценарије са дубоким линковима (Navigator 2.0). У Navigator 2.0 Route представља Page који RouterDelegate конвертује из конфигурације руте. Дакле, разумевање Route-а је неопходно за рад са било којим навигационим системом Flutter-а — без обзира на изабрани приступ или пакет.
Flutter пружа неколико уграђених имплементација Route, од којих свака прилагођава понашање одређеној платформи. Избор исправног типа Route утиче на корисничко искуство: Material анимација на Android-у и Cupertino анимација на iOS-у стварају осећај „изворне“ апликације.
| Тип Route-а | Анимација | Платформа | Карактеристике |
|---|---|---|---|
| MaterialPageRoute | Клиз одоздо према горе | Android, десктоп | сенка при прелазу, аутоматска обрада SafeArea |
| CupertinoPageRoute | Клиз са десна на лево | iOS, iPadOS | гест превлачења уназад, провидна позадина при прелазу |
| PlatformRoute | Аутоматски избор | Све платформе | бира тип на основу TargetPlatform |
| PageRouteBuilder | Прилагођена | Све платформе | потпуна контрола над анимацијом преко AnimationController-а |
MaterialPageRoute — најчешће коришћена имплементација Route-а. Анимира улазак новог екрана одоздо према горе са постепеним појављивањем. При изласку, екран се анимира одозго према доле, враћајући се у почетни положај. Алатна трака (AppBar) и тело екрана се анимирају одвојено, стварајући ефекат хијерархије.
CupertinoPageRoute имитира UINavigationController из iOS-а. Нови екран улази са десне стране, прекривајући претходни. Кључна карактеристика — подршка за интерактивни гест превлачења уназад, имплементиран преко CupertinoBackGestureDetector-а. Овај гест се обрађује чак и усред анимације, обезбеђујући природно понашање познато корисницима iPhone-а.
Route има сопствени животни циклус који се разликује од животног циклуса обичног StatefulWidget-а. Разумевање овог циклуса је неопходно за правилну иницијализацију података, претплату на стримове и ослобађање ресурса при затварању екрана.
Животни циклус Route-а се састоји од четири главне фазе. Transition — Route се креира и анимира при уласку (позива се didPush). Active — Route је потпуно приказан и интерактивно комуницира са корисником. Inactive — други Route прекрива тренутни (дијалог, доњи екран), али Route остаје у стек-у. Disposed — Route се уклања из стека и уништава, позивају се didPop и dispose.
Методе животног циклуса Route-а могу бити прегажене у прилагођеној имплементацији. На пример, didPop се позива када се Route уклони из стека — овде се може сачувати верзија података. didChangeNext се позива када се следећи Route у стек-у променио — корисно за ажурирање UI-ја при промени историје навигације.
Према Flutter API Route.didPop (2026), важно је не мешати животни циклус Route-а са животним циклусом State-а унутар Route-а. StatefulWidget унутар Route-а има сопствени initState и dispose који се позивају у фазама Transition и Disposed респективно. Route живи дуже од свог унутрашњег State-а — Route остаје у Overlay-у чак и када су његови виџети привремено скривени другим Route-ом.
Route пружа механизме за пренос података како на улазу (при креирању), тако и на излазу (при завршетку). Исправан пренос података преко Route-а елиминише потребу за глобалним променљивим и InheritedWidget-ом, чинећи навигацију типски безбедном и предвидљивом.
За пренос података на нови екран користи се конструктор примајућег виџета или аргумент arguments у Navigator.pushNamed. Унутар Route-а подаци су доступни преко RouteSettings.arguments који се чува у објекту Route. Овај приступ ради за све типове Route-а — MaterialPageRoute, CupertinoPageRoute и прилагођене имплементације.
За враћање података користи се други аргумент Navigator.pop(context, result). Navigator.push враћа Future
При директном позиву Navigator.push са MaterialPageRoute подаци се преносе преко конструктора циљног екрана. MethodChannel се не користи — ово је чиста Dart интеракција. Овај приступ је пожељан за типски безбедан пренос сложених објеката.
Размотримо пример креирања прилагођеног Route-а са сопственом анимацијом и преносом података. PageRouteBuilder омогућава дефинисање анимације уласка и изласка са потпуном контролом над кривом анимације и трајањем.
// Прилагођени 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 са избором корисника, а позивајући екран добија ове податке преко Future-а од push-а. Route обезбеђује потпуну изолацију: верзије на екрану детаља не утичу на стање листе.
Често постављана питања
Route — је објекат који управља екраном на нивоу навигације: чува анимацију, ModalBarrier и животни циклус. Widget — је опис дела интерфејса. Route садржи Widget унутар себе, али такође пружа услуге (Overlay слој, Hero анимација) недоступне обичним виџетима. Један Route може садржати сложену хијерархију виџета било које дубине.
Користите PageRouteBuilder са параметрима pageBuilder (изградња екрана) и transitionsBuilder (дефинисање анимације). У transitionsBuilder-у су доступни animation (0.0–1.0) и secondaryAnimation за паралелне анимације. За потпуну контролу креирајте подкласу Route-а и прегазите buildPage, createAnimationController и buildTransitions, што ће дати приступ нисконивоским AnimationController-има.
За пренос сложених објеката користите конструктор циљног екрана при директном Navigator.push или аргумент arguments при pushNamed. Уверите се да је објекат серијализује (Map, JSON или прилагођена класа). За типски безбедан пренос у Flutter-у се користе freezed или json_serializable модели који гарантују коректну десеријализацију при преносу преко RouteSettings-а.
Route.dispose се не позива ако Route остане у стек-у Navigator-а. На пример, при отварању новог Route-а, стари Route прелази у неактивно стање (Inactive), али се не уништава — остаје у стек-у за брзи повратак. Dispose се позива само при уклањању Route-а из стека кроз pop, pushReplacement или pushAndRemoveUntil. За ослобађање ресурса користите dispose State-а унутар Route-а, а не dispose самог Route-а.
Користите ModalRoute.of(context) за добијање тренутног Route-а из BuildContext-а. Својство ModalRoute.isActive показује да ли је Route тренутно видљиви екран. ModalRoute.isCurrent — true ако је Route на врху стека. За праћење промена у стек-у претплатите се на Navigator посматраче преко RouteAware и RouteObserver, који обавештавају о промени активног Route-а.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође