mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-27 17:29:50 +08:00
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:
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
},
|
},
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
},
|
},
|
||||||
|
@ -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);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
Reference in New Issue
Block a user