Изучение методов получения текущего имени маршрута во Flutter

Во 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, вы можете использовать его возможности управления состоянием для отслеживания текущего имени маршрута. Вот пример: