개발을 진행하면서, Navigation의 stack 상태를 볼수 있다면 좋다는 생각이 들었고,
찾아보니 내장으로 NavigatorObserver라는 클래스가 있었다.
class NavigatorObserver {
NavigatorState? get navigator => _navigators[this];
static final Expando<NavigatorState> _navigators = Expando<NavigatorState>();
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) { }
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) { }
void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) { }
void didReplace({ Route<dynamic>? newRoute, Route<dynamic>? oldRoute }) { }
void didStartUserGesture(Route<dynamic> route, Route<dynamic>? previousRoute) { }
void didStopUserGesture() { }
}
이런 내장 클래스가 있는데, 각각의 내용은
route
: 새로 추가된 라우트.previousRoute
: 바로 아래에 있던 이전 라우트(없을 수도 있음).route
: 제거된 라우트.previousRoute
: 이제 활성화된 새 라우트(없을 수도 있음).route
: 제거된 라우트.previousRoute
: 제거된 라우트 아래에 있는 라우트(없을 수도 있음).newRoute
: 새로 대체된 라우트.oldRoute
: 기존의 대체된 라우트.route
: 현재 활성화된 라우트.previousRoute
: 이동 중 활성화될 라우트(없을 수도 있음).로 정리할 수 있다.
// logger_navigator_observer.dart
import 'package:flutter/material.dart';
import 'dart:developer';
class LoggerNavigatorObserver extends NavigatorObserver {
void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
print(route);
_logNavigation(route.settings.name, 'push');
}
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
_logNavigation(route.settings.name, 'pop');
}
void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
if (newRoute != null) {
_logNavigation(newRoute.settings.name, 'replace');
}
}
void _logNavigation(String? routeName, String action) {
if (routeName != null) {
log("Screen $action: $routeName", name: 'Navigation');
}
}
}
필요하다고 생각하는 부분에 해당 로그를 찍을 수 있게 파일을 하나 만들고,
// main.dart
Widget build(BuildContext context, WidgetRef ref) {
final userState = ref.watch(userViewModelProvider);
return MaterialApp(
navigatorObservers: [
LoggerNavigatorObserver(),
],
routes: {
'/chat_create': (context) => ChatCreate(),
'/chat_page': (context) => ChatPage(),
'/chat_submit': (context) => ChatSubmitPage(),
'/login': (context) => LoginPage(),
'/map': (context) => MapPage(),
'/resigter': (context) => RegisterPage()
},
title: 'Match-up',
theme: ThemeData(
fontFamily: 'Pretendard',
),
home: _getHome(userState));
}
MaterialApp
의 navigatorObservers
파라미터에 넣어주면 된다.
신나서 왔다갔다 해보니 이렇게 찍힌다. 이걸 이쁘게 찍을수 있는 프로젝트를 해보자