Класс NavigatorObserver
Класс NavigatorObserver вешают на
Navigator
через observers.
При push вызывают
didPush,
при pop -
didPop.
Так логируют переходы или обновляют аналитику.
Синтаксис
class LogObserver extends NavigatorObserver
{
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {}
}
Методы
| Метод | Описание |
|---|---|
didPush |
Параметр route - новый верхний маршрут, previousRoute - тот, что был верхним до push. Давайте разберём вызов на примерах. |
didPop |
Параметр route - маршрут, который сняли, previousRoute - новый верхний маршрут. Давайте разберём вызов на примерах. |
Пример
Давайте выведем имя маршрута при push:
import 'package:flutter/material.dart';
class PrintObserver extends NavigatorObserver
{
@override
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute)
{
debugPrint(route.settings.name ?? 'abcde');
}
}
class ObsHome extends StatelessWidget
{
const ObsHome({super.key});
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute<void>(
settings: const RouteSettings(name: '/next'),
builder: (ctx) => const Scaffold(
body: Center(child: Text('12345')),
),
),
);
},
child: const Text('abcde'),
),
),
);
}
}
void main()
{
runApp(
MaterialApp(
navigatorObservers: [PrintObserver()],
home: ObsHome(),
),
);
}
На экране откроется второй маршрут; в консоли отладки появится '/next' из didPush.
Пример
Давайте залогируем pop:
import 'package:flutter/material.dart';
class PopLogObserver extends NavigatorObserver
{
@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute)
{
debugPrint('pop');
}
}
void main()
{
runApp(
MaterialApp(
navigatorObservers: [PopLogObserver()],
home: Scaffold(
body: Center(
child: Text('12345'),
),
),
),
);
}
На экране корневой текст; при pop с этого маршрута observer напишет pop в консоль.