Освоение Flutter: получение самого верхнего экрана в стеке

Метод 1. Использование навигатора

Среда Flutter предоставляет класс Navigator, который управляет стеком объектов Route. Чтобы получить самый верхний экран в стеке, вы можете использовать свойство currentRouteкласса Navigator. Вот пример:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: MyApp(),
  ));
}
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Topmost Screen'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Get Top Screen'),
          onPressed: () {
            Navigator.push(context, MaterialPageRoute(builder: (context) => Screen2()));
          },
        ),
      ),
    );
  }
}
class Screen2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen 2'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Get Top Screen'),
          onPressed: () {
            var topScreen = Navigator.of(context).currentRoute;
            print('Top Screen: $topScreen');
          },
        ),
      ),
    );
  }
}

В этом примере у нас есть простое приложение Flutter с двумя экранами. При нажатии кнопки на первом экране происходит переход на второй экран. На втором экране нажатие кнопки приведет к распечатке маршрута верхнего экрана с помощью Navigator.of(context).currentRoute.

Метод 2: использование NavigatorState MaterialApp

Другой способ получить самый верхний экран — использовать NavigatorState, предоставляемый виджетом MaterialApp. Вы можете получить к нему доступ с помощью GlobalKeyи вызвать свойство topRoute. Вот пример:

import 'package:flutter/material.dart';
void main() {
  runApp(MaterialApp(
    home: MyApp(),
  ));
}
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      navigatorKey: navigatorKey,
      home: Scaffold(
        appBar: AppBar(
          title: Text('Topmost Screen'),
        ),
        body: Center(
          child: RaisedButton(
            child: Text('Get Top Screen'),
            onPressed: () {
              Navigator.push(context, MaterialPageRoute(builder: (context) => Screen2()));
            },
          ),
        ),
      ),
    );
  }
}
class Screen2 extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen 2'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Get Top Screen'),
          onPressed: () {
            var topScreen = navigatorKey.currentState?.topRoute?.settings.name;
            print('Top Screen: $topScreen');
          },
        ),
      ),
    );
  }
}

В этом примере мы используем GlobalKey<NavigatorState>с именем navigatorKeyдля доступа к NavigatorState, предоставленному MaterialApp. Внутри кнопки второго экрана onPressed обратного вызова мы используем navigatorKey.currentState?.topRoute?.settings.name, чтобы получить имя маршрута верхнего экрана.

Метод 3. Использование диспетчера стека

Если вы используете собственный менеджер стека или сторонний пакет, например stacked, вы можете использовать их API, чтобы получить самый верхний экран. Эти пакеты часто предоставляют удобные методы управления стеком и получения верхнего экрана. Обязательно обратитесь к их документации для получения подробной информации о реализации.

Заключение

В этой статье мы рассмотрели различные методы получения самого верхнего экрана в стеке Flutter. Мы использовали класс Navigator, NavigatorStateи собственные менеджеры стека. Понимая эти методы, вы сможете эффективно управлять навигацией по экрану в приложении Flutter.

Не забудьте выбрать метод, который лучше всего соответствует требованиям вашего проекта и стилю кодирования. Приятного кодирования!