Метод popAndPushNamed
Метод popAndPushNamed виджета Navigator
сначала снимает текущий экран, затем открывает следующий по имени.
Имя берут из таблицы маршрутов.
Результат снятого экрана можно передать отдельно.
Синтаксис
Navigator.popAndPushNamed(context, '/next');
Параметры
| Параметр | Описание |
|---|---|
context | BuildContext под Navigator. |
routeName | Имя следующего маршрута. |
result | Необязательный результат для снятого Route. |
Пример
Давайте заменить экран через popAndPushNamed:
import 'package:flutter/material.dart';
Route<dynamic>? onGenerateRoute(RouteSettings settings)
{
if (settings.name == '/next') {
return MaterialPageRoute<void>(
settings: settings,
builder: (ctx) => Scaffold(
body: Center(
child: Text('12345'),
),
),
);
}
return MaterialPageRoute<void>(
settings: settings,
builder: (ctx) => Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.popAndPushNamed(ctx, '/next');
},
child: const Text('abcde'),
),
),
),
);
}
void main()
{
runApp(
MaterialApp(
initialRoute: '/first',
onGenerateRoute: onGenerateRoute,
),
);
}
На экране кнопка 'abcde'; popAndPushNamed откроет '/next' с '12345' без роста стопки.
Пример
Давайте передать arguments при popAndPushNamed:
import 'package:flutter/material.dart';
Route<dynamic>? routes(RouteSettings settings)
{
if (settings.name == '/show') {
return MaterialPageRoute<void>(
settings: settings,
builder: (ctx) => Scaffold(
body: Center(
child: Text('${settings.arguments}'),
),
),
);
}
return MaterialPageRoute<void>(
settings: settings,
builder: (ctx) => Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.popAndPushNamed(
ctx,
'/show',
arguments: 'abcde',
);
},
child: const Text('go'),
),
),
),
);
}
void main()
{
runApp(
MaterialApp(
initialRoute: '/form',
onGenerateRoute: routes,
),
);
}
На экране после перехода по центру будет 'abcde' из arguments.
Смотрите также
- метод
pushNamed,pushбезpop - метод
pushReplacement,
замена верхнегоRoute - метод
pop,
только снятиеRoute - класс
RouteSettings,
name и arguments