Add a CustomRouteObserver

This basically asserts if we move to a route without a name. This way
I'll always catch when a route doesn't have a name, and I can start
getting better analytics on which screens are used most frequently.
This commit is contained in:
Vishesh Handa
2020-05-26 13:14:33 +02:00
parent 85ecca46f0
commit 8b4fa886ba
8 changed files with 68 additions and 10 deletions

View File

@ -1,4 +1,6 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gitjournal/app.dart'; import 'package:gitjournal/app.dart';
import 'package:gitjournal/error_reporting.dart'; import 'package:gitjournal/error_reporting.dart';
@ -85,3 +87,41 @@ void logEvent(Event event, {Map<String, String> parameters}) {
getAnalytics().log(e: event, parameters: parameters); getAnalytics().log(e: event, parameters: parameters);
Log.d("Event $event"); Log.d("Event $event");
} }
class CustomRouteObserver extends RouteObserver<PageRoute<dynamic>> {
void _sendScreenView(PageRoute<dynamic> route) {
final String screenName = route.settings.name;
assert(screenName != null, "Screen name is null $route");
}
@override
void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
super.didPush(route, previousRoute);
if (route is PageRoute) {
_sendScreenView(route);
} else {
print("route in not a PageRoute! $route");
}
}
@override
void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {
super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
if (newRoute is PageRoute) {
_sendScreenView(newRoute);
} else {
print("newRoute in not a PageRoute! $newRoute");
}
}
@override
void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
super.didPop(route, previousRoute);
if (previousRoute is PageRoute && route is PageRoute) {
_sendScreenView(previousRoute);
} else {
print("previousRoute in not a PageRoute! $previousRoute");
print("route in not a PageRoute! $route");
}
}
}

View File

@ -288,7 +288,10 @@ class _JournalAppState extends State<JournalApp> {
locale: EasyLocalization.of(context).locale, locale: EasyLocalization.of(context).locale,
theme: themeData, theme: themeData,
navigatorObservers: <NavigatorObserver>[JournalApp.observer], navigatorObservers: <NavigatorObserver>[
JournalApp.observer,
CustomRouteObserver(),
],
initialRoute: initialRoute, initialRoute: initialRoute,
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
//debugShowMaterialGrid: true, //debugShowMaterialGrid: true,

View File

@ -64,6 +64,7 @@ Widget buildFolderView(
void openNoteEditor(BuildContext context, Note note) async { void openNoteEditor(BuildContext context, Note note) async {
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => NoteEditor.fromNote(note), builder: (context) => NoteEditor.fromNote(note),
settings: const RouteSettings(name: '/note/'),
); );
var showUndoSnackBar = await Navigator.of(context).push(route); var showUndoSnackBar = await Navigator.of(context).push(route);
if (showUndoSnackBar != null) { if (showUndoSnackBar != null) {

View File

@ -32,6 +32,7 @@ class _FolderListingScreenState extends State<FolderListingScreen> {
builder: (context) => FolderView( builder: (context) => FolderView(
notesFolder: folder, notesFolder: folder,
), ),
settings: const RouteSettings(name: '/folder/'),
); );
Navigator.of(context).push(route); Navigator.of(context).push(route);
}, },

View File

@ -10,6 +10,7 @@ import 'package:gitjournal/core/sorting_mode.dart';
import 'package:gitjournal/folder_views/standard_view.dart'; import 'package:gitjournal/folder_views/standard_view.dart';
import 'package:gitjournal/screens/note_editor.dart'; import 'package:gitjournal/screens/note_editor.dart';
import 'package:gitjournal/screens/settings_screen.dart'; import 'package:gitjournal/screens/settings_screen.dart';
import 'package:gitjournal/settings.dart';
import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/state_container.dart';
import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils.dart';
import 'package:gitjournal/widgets/app_drawer.dart'; import 'package:gitjournal/widgets/app_drawer.dart';
@ -207,8 +208,11 @@ class _FolderViewState extends State<FolderView> {
fsFolder = getFolderForEditor(rootFolder, editorType); fsFolder = getFolderForEditor(rootFolder, editorType);
} }
var routeType =
SettingsEditorType.fromEditorType(editorType).toInternalString();
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => NoteEditor.newNote(fsFolder, editorType), builder: (context) => NoteEditor.newNote(fsFolder, editorType),
settings: RouteSettings(name: '/newNote/$routeType'),
); );
await Navigator.of(context).push(route); await Navigator.of(context).push(route);
_scaffoldKey.currentState.removeCurrentSnackBar(); _scaffoldKey.currentState.removeCurrentSnackBar();

View File

@ -356,6 +356,7 @@ class NoteEditorState extends State<NoteEditor> {
selectedTags: note.tags, selectedTags: note.tags,
allTags: allTags, allTags: allTags,
), ),
settings: const RouteSettings(name: '/editTags/'),
); );
var newTags = await Navigator.of(context).push(route); var newTags = await Navigator.of(context).push(route);
assert(newTags != null); assert(newTags != null);

View File

@ -184,6 +184,7 @@ class SettingsListState extends State<SettingsList> {
onTap: () { onTap: () {
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => GitRemoteSettingsScreen(), builder: (context) => GitRemoteSettingsScreen(),
settings: const RouteSettings(name: '/settings/gitRemote'),
); );
Navigator.of(context).push(route); Navigator.of(context).push(route);
}, },
@ -196,6 +197,7 @@ class SettingsListState extends State<SettingsList> {
onTap: () { onTap: () {
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => SettingsEditorsScreen(), builder: (context) => SettingsEditorsScreen(),
settings: const RouteSettings(name: '/settings/editors'),
); );
Navigator.of(context).push(route); Navigator.of(context).push(route);
}, },
@ -219,6 +221,7 @@ class SettingsListState extends State<SettingsList> {
onTap: () { onTap: () {
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => NoteMetadataSettingsScreen(), builder: (context) => NoteMetadataSettingsScreen(),
settings: const RouteSettings(name: '/settings/noteMetaData'),
); );
Navigator.of(context).push(route); Navigator.of(context).push(route);
}, },
@ -229,6 +232,7 @@ class SettingsListState extends State<SettingsList> {
onTap: () { onTap: () {
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => SettingsImagesScreen(), builder: (context) => SettingsImagesScreen(),
settings: const RouteSettings(name: '/settings/images'),
); );
Navigator.of(context).push(route); Navigator.of(context).push(route);
}, },
@ -260,6 +264,7 @@ class SettingsListState extends State<SettingsList> {
onTap: () { onTap: () {
var route = MaterialPageRoute( var route = MaterialPageRoute(
builder: (context) => DebugScreen(), builder: (context) => DebugScreen(),
settings: const RouteSettings(name: '/settings/debug'),
); );
Navigator.of(context).push(route); Navigator.of(context).push(route);
}, },

View File

@ -43,7 +43,8 @@ class TagListingScreen extends StatelessWidget {
leading: FaIcon(FontAwesomeIcons.tag, color: titleColor), leading: FaIcon(FontAwesomeIcons.tag, color: titleColor),
title: Text(tag), title: Text(tag),
onTap: () { onTap: () {
var route = MaterialPageRoute(builder: (context) { var route = MaterialPageRoute(
builder: (context) {
var rootFolder = Provider.of<NotesFolderFS>(context); var rootFolder = Provider.of<NotesFolderFS>(context);
var folder = FlattenedNotesFolder( var folder = FlattenedNotesFolder(
rootFolder, rootFolder,
@ -52,7 +53,9 @@ class TagListingScreen extends StatelessWidget {
); );
return FolderView(notesFolder: folder); return FolderView(notesFolder: folder);
}); },
settings: const RouteSettings(name: '/tags/'),
);
Navigator.of(context).push(route); Navigator.of(context).push(route);
}, },
); );