Класс RouterDelegate
Класс RouterDelegate реализуют для
Router.
Метод
build
возвращает Navigator со списком pages.
Метод
setNewRoutePath
принимает новую конфигурацию из URL.
Метод
popRoute
обрабатывает системный назад.
Синтаксис
class AppDelegate extends RouterDelegate<AppConfig>
{
@override
Widget build(BuildContext context) {
return Navigator(
pages: [
MaterialPage<void>(
child: Scaffold(
body: Center(
child: Text('abcde'),
),
),
),
],
onPopPage: (route, result) => route.didPop(result),
);
}
}
Методы
| Метод | Описание |
|---|---|
build |
Router вызывает build при каждом обновлении конфигурации. Давайте разберём вызов на примерах.
|
setNewRoutePath |
Его вызывает Router после parseRouteInformation. Давайте разберём вызов на примерах.
|
popRoute |
Возвращает Future |
Пример
Давайте реализуем delegate с одной страницей:
import 'package:flutter/material.dart';
class AppConfig {}
class AppDelegate extends RouterDelegate<AppConfig>
{
@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(AppConfig configuration) async {}
@override
AppConfig get currentConfiguration => AppConfig();
}
void main()
{
runApp(
MaterialApp.router(
routerDelegate: AppDelegate(),
routeInformationParser: AppParser(),
),
);
}
class AppParser extends RouteInformationParser<AppConfig>
{
@override
Future<AppConfig> parseRouteInformation(
RouteInformation routeInformation,
) async {
return AppConfig();
}
@override
RouteInformation restoreRouteInformation(AppConfig configuration) {
return RouteInformation(uri: Uri.parse('/'));
}
}
На экране RouterDelegate построит Navigator с текстом 'abcde'.
Пример
Давайте вернём true из popRoute, когда pop невозможен:
import 'package:flutter/material.dart';
class GuardDelegate extends RouterDelegate<AppConfig>
{
@override
Widget build(BuildContext context) {
return Navigator(
pages: const [
MaterialPage<void>(
child: Scaffold(
body: Center(
child: Text('12345'),
),
),
),
],
onPopPage: (route, result) => route.didPop(result),
);
}
@override
Future<bool> popRoute() async => true;
@override
Future<void> setNewRoutePath(AppConfig configuration) async {}
@override
AppConfig get currentConfiguration => AppConfig();
}
На экране delegate сообщит Router, что pop обработан, даже если стопка из одной страницы.