Во Flutter управление маршрутами имеет важное значение для создания надежных и динамичных приложений. Могут возникнуть сценарии, в которых вам потребуется программно определить имя текущего маршрута. В этой статье мы рассмотрим несколько методов получения текущего имени маршрута во Flutter, а также примеры кода.
Метод 1: использование маршрута наблюдения навигатора
Виджет Navigatorво Flutter предоставляет ObserverList, который позволяет нам наблюдать за изменениями маршрута. Добавив RouteObserverк Navigator, мы можем прослушивать изменения маршрута и получать текущее имя маршрута. Вот пример:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Route Name Demo',
navigatorObservers: [routeObserver],
home: Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: Center(
child: ElevatedButton(
child: Text('Go to Second Page'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
);
},
),
),
),
);
}
}
class SecondPage extends StatefulWidget {
@override
_SecondPageState createState() => _SecondPageState();
}
class _SecondPageState extends State<SecondPage> with RouteAware {
@override
void didChangeDependencies() {
super.didChangeDependencies();
routeObserver.subscribe(this, ModalRoute.of(context));
}
@override
void dispose() {
routeObserver.unsubscribe(this);
super.dispose();
}
@override
void didPush() {
print('Current route name: ${ModalRoute.of(context).settings.name}');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Page'),
),
body: Center(
child: ElevatedButton(
child: Text('Go back'),
onPressed: () {
Navigator.pop(context);
},
),
),
);
}
}
В этом методе мы используем RouteObserverдля подписки на изменения маршрута. Реализуя миксин RouteAware, мы можем прослушивать такие события, как didPush, didPopи т. д., и получать имя текущего маршрута из ModalRouteобъектов.
Метод 2: использование обратного вызова MaterialApp onGenerateRoute
Другой подход — использовать обратный вызов onGenerateRoute, предоставляемый MaterialApp. Этот обратный вызов запускается всякий раз, когда отправляется именованный маршрут, что позволяет нам получить текущее имя маршрута. Вот пример:
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Route Name Demo',
onGenerateRoute: (settings) {
print('Current route name: ${settings.name}');
return MaterialPageRoute(builder: (context) => SecondPage());
},
home: Scaffold(
appBar: AppBar(
title: Text('Home'),
),
body: Center(
child: ElevatedButton(
child: Text('Go to Second Page'),
onPressed: () {
Navigator.pushNamed(context, '/second');
},
),
),
),
);
}
}
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second Page'),
),
body: Center(
child: ElevatedButton(
child: Text('Go back'),
onPressed: () {
Navigator.pop(context);
},
),
),
);
}
}
В этом методе мы определяем обратный вызов onGenerateRouteи получаем имя текущего маршрута из свойства settings.name.
Метод 3: использование пакета Provider
Если вы используете пакет Provider в своем приложении Flutter, вы можете использовать его возможности управления состоянием для отслеживания текущего имени маршрута. Вот пример: