Виджет Router
Виджет Router строит Navigator из
RouterDelegate
и
RouteInformationParser.
Параметр routerDelegate решает, какие страницы открыты.
Параметр routeInformationParser
разбирает
RouteInformation
в конфигурацию маршрута.
Синтаксис
Router(
routerDelegate: myDelegate,
routeInformationParser: myParser,
)
Параметры
| Параметр | Описание |
|---|---|
routerDelegate |
Делегат, который строит Navigator и стопку страниц.
|
routeInformationParser |
Парсер адреса в конфигурацию маршрута. |
routeInformationProvider |
Источник текущего RouteInformation, например для web URL.
|
backButtonDispatcher |
Обработчик системной кнопки назад. |
Пример
Давайте соберём минимальный Router с одной страницей:
import 'package:flutter/material.dart';
class SimpleConfig {}
class SimpleParser extends RouteInformationParser<SimpleConfig>
{
@override
Future<SimpleConfig> parseRouteInformation(
RouteInformation routeInformation,
) async {
return SimpleConfig();
}
@override
RouteInformation restoreRouteInformation(SimpleConfig configuration) {
return RouteInformation(uri: Uri.parse('/'));
}
}
class SimpleDelegate extends RouterDelegate<SimpleConfig>
{
@override
Widget build(BuildContext context) {
return Navigator(
pages: const [
MaterialPage<void>(
child: Scaffold(
body: Center(
child: Text('abcde'),
),
),
),
],
onPopPage: (route, result) => route.didPop(result),
);
}
@override
Future<void> setNewRoutePath(SimpleConfig configuration) async {}
@override
SimpleConfig get currentConfiguration => SimpleConfig();
}
void main()
{
runApp(
MaterialApp.router(
routerDelegate: SimpleDelegate(),
routeInformationParser: SimpleParser(),
),
);
}
На экране Router покажет одну страницу с текстом 'abcde' через declarative pages.
Пример
Давайте покажем вторую страницу через список pages:
import 'package:flutter/material.dart';
class SimpleConfig {}
class SimpleParser extends RouteInformationParser<SimpleConfig>
{
@override
Future<SimpleConfig> parseRouteInformation(
RouteInformation routeInformation,
) async {
return SimpleConfig();
}
@override
RouteInformation restoreRouteInformation(SimpleConfig configuration) {
return RouteInformation(uri: Uri.parse('/'));
}
}
class TwoDelegate extends RouterDelegate<SimpleConfig>
{
@override
Widget build(BuildContext context) {
return Navigator(
pages: const [
MaterialPage<void>(
child: Scaffold(
body: Center(child: Text('abcde')),
),
),
MaterialPage<void>(
child: Scaffold(
body: Center(child: Text('12345')),
),
),
],
onPopPage: (route, result) => route.didPop(result),
);
}
@override
Future<void> setNewRoutePath(SimpleConfig configuration) async {}
@override
SimpleConfig get currentConfiguration => SimpleConfig();
}
void main()
{
runApp(
MaterialApp.router(
routerDelegate: TwoDelegate(),
routeInformationParser: SimpleParser(),
),
);
}
На экране delegate сразу построит две MaterialPage; виден верхний экран с '12345'.
Смотрите также
-
класс
RouterDelegate,
строитNavigatorдляRouter -
класс
RouteInformationParser,
разбирает URI в конфигурацию -
класс
RouteInformation,
адрес и состояние маршрута -
виджет
Navigator,
императивная стопка внутри delegate