Виджет Navigator
Виджет Navigator держит стопку
Route
и показывает верхний экран.
Новый экран открывают через
push
или
pushNamed,
возврат - через
pop.
Маршруты по имени задают onGenerateRoute
и initialRoute,
наблюдателей вешают в observers.
Синтаксис
Navigator(
onGenerateRoute: (settings) {
return MaterialPageRoute<void>(
builder: (context) => const Placeholder(),
);
},
)
Параметры
| Параметр | Описание |
|---|---|
initialRoute |
Имя первого маршрута, если не задан home. |
onGenerateRoute |
Строит Route по
RouteSettings.
|
pages |
Список Page для декларативной навигации. |
observers |
Список
NavigatorObserver
для push и pop.
|
Методы
| Метод | Описание |
|---|---|
of |
Возвращает State Navigator из context. |
maybeOf |
То же, но null без Navigator. |
push |
Кладёт Route на стопку. |
pop |
Снимает верхний Route. |
maybePop |
Pop, если canPop true. |
canPop |
Проверяет, можно ли pop. |
pushReplacement |
Меняет верхний Route. |
pushAndRemoveUntil |
Push и срезает стопку до предиката. |
popUntil |
Pop до Route, где предикат true. |
pushNamed |
Push по имени маршрута. |
pushNamedAndRemoveUntil |
Именованный push со срезом стопки. |
popAndPushNamed |
Pop текущего и pushNamed. |
Пример
Давайте откроем второй экран через push:
import 'package:flutter/material.dart';
class HomeScreen extends StatelessWidget
{
const HomeScreen({super.key});
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute<void>(
builder: (ctx) => const SecondScreen(),
),
);
},
child: const Text('abcde'),
),
),
);
}
}
class SecondScreen extends StatelessWidget
{
const SecondScreen({super.key});
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: Text('12345'),
),
);
}
}
void main()
{
runApp(
MaterialApp(
home: HomeScreen(),
),
);
}
На экране кнопка 'abcde'; по нажатию откроется второй экран с текстом '12345'.
Пример
Давайте вернёмся назад через pop:
import 'package:flutter/material.dart';
class BackScreen extends StatelessWidget
{
const BackScreen({super.key});
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('12345'),
),
),
);
}
}
void main()
{
runApp(
MaterialApp(
home: BackScreen(),
),
);
}
На экране кнопка '12345'; нажатие закроет экран, если под ним есть маршрут в стопке.
Смотрите также
-
класс
MaterialPageRoute,
маршрут со сдвигомMaterial -
виджет
PopScope,
который перехватывает системный назад -
класс
Route,
описание одной страницы в стопке -
виджет
Router,
декларативная навигация по URL