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/material.dart';
import 'package:flutter/services.dart';
import 'package:gitjournal/app.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);
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,
theme: themeData,
navigatorObservers: <NavigatorObserver>[JournalApp.observer],
navigatorObservers: <NavigatorObserver>[
JournalApp.observer,
CustomRouteObserver(),
],
initialRoute: initialRoute,
debugShowCheckedModeBanner: false,
//debugShowMaterialGrid: true,

View File

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

View File

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

View File

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

View File

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

View File

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