From f1ccae1db081024fdb9ae25b52c7058cfb56066f Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Thu, 22 Oct 2020 23:22:40 +0200 Subject: [PATCH] Split App into AppRouter There is way too much code in this file, and it makes it difficult to test and reason about. Lets start simplifying this huge class. --- lib/app.dart | 121 ++---------------------------------- lib/app_router.dart | 146 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 151 insertions(+), 116 deletions(-) create mode 100644 lib/app_router.dart diff --git a/lib/app.dart b/lib/app.dart index f5b6864c..3e2be437 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -18,25 +18,13 @@ import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:gitjournal/analytics.dart'; +import 'package:gitjournal/app_router.dart'; import 'package:gitjournal/app_settings.dart'; import 'package:gitjournal/appstate.dart'; -import 'package:gitjournal/core/md_yaml_doc_codec.dart'; import 'package:gitjournal/iap.dart'; -import 'package:gitjournal/screens/filesystem_screen.dart'; -import 'package:gitjournal/screens/folder_listing.dart'; -import 'package:gitjournal/screens/graph_view.dart'; -import 'package:gitjournal/screens/home_screen.dart'; -import 'package:gitjournal/screens/note_editor.dart'; -import 'package:gitjournal/screens/onboarding_screens.dart'; -import 'package:gitjournal/screens/purchase_screen.dart'; -import 'package:gitjournal/screens/purchase_thankyou_screen.dart'; -import 'package:gitjournal/screens/settings_screen.dart'; -import 'package:gitjournal/screens/tag_listing.dart'; import 'package:gitjournal/settings.dart'; -import 'package:gitjournal/setup/screens.dart'; import 'package:gitjournal/state_container.dart'; import 'package:gitjournal/themes.dart'; -import 'package:gitjournal/utils.dart'; import 'package:gitjournal/utils/logger.dart'; class JournalApp extends StatefulWidget { @@ -318,14 +306,7 @@ class _JournalAppState extends State { var stateContainer = Provider.of(context); var settings = Provider.of(context); var appSettings = Provider.of(context); - - var initialRoute = '/'; - if (!appSettings.onBoardingCompleted) { - initialRoute = '/onBoarding'; - } - if (settings.homeScreen == SettingsHomeScreen.AllFolders) { - initialRoute = '/folders'; - } + var router = AppRouter(settings: settings, appSettings: appSettings); return MaterialApp( key: const ValueKey("App"), @@ -340,103 +321,11 @@ class _JournalAppState extends State { navigatorObservers: [ AnalyticsRouteObserver(), ], - initialRoute: initialRoute, + initialRoute: router.initialRoute(), debugShowCheckedModeBanner: false, //debugShowMaterialGrid: true, - onGenerateRoute: (routeSettings) { - var route = routeSettings.name; - if (route == '/folders' || route == '/tags' || route == '/filesystem') { - return PageRouteBuilder( - settings: routeSettings, - pageBuilder: (_, __, ___) => - _screenForRoute(route, stateContainer, settings), - transitionsBuilder: (_, anim, __, child) { - return FadeTransition(opacity: anim, child: child); - }, - ); - } - - return MaterialPageRoute( - settings: routeSettings, - builder: (context) => _screenForRoute( - route, - stateContainer, - settings, - ), - ); - }, + onGenerateRoute: (rs) => + router.generateRoute(rs, stateContainer, _sharedText, _sharedImages), ); } - - Widget _screenForRoute( - String route, - StateContainer stateContainer, - Settings settings, - ) { - switch (route) { - case '/': - return HomeScreen(); - case '/folders': - return FolderListingScreen(); - case '/filesystem': - return FileSystemScreen(); - case '/tags': - return TagListingScreen(); - case '/graph': - return GraphViewScreen(); - case '/settings': - return SettingsScreen(); - case '/setupRemoteGit': - return GitHostSetupScreen( - repoFolderName: settings.folderName, - remoteName: "origin", - onCompletedFunction: stateContainer.completeGitHostSetup, - ); - case '/onBoarding': - return OnBoardingScreen(); - case '/purchase': - return PurchaseScreen(); - case '/purchase_thank_you': - return PurchaseThankYouScreen(); - } - - if (route.startsWith('/newNote/')) { - var type = route.substring('/newNote/'.length); - var et = SettingsEditorType.fromInternalString(type).toEditorType(); - - Log.i("New Note - $route"); - Log.i("EditorType: $et"); - - var rootFolder = widget.appState.notesFolder; - var sharedImages = _sharedImages; - var sharedText = _sharedText; - - _sharedText = null; - _sharedImages = null; - - Log.d("sharedText: $sharedText"); - Log.d("sharedImages: $sharedImages"); - - var extraProps = {}; - if (settings.customMetaData.isNotEmpty) { - var map = MarkdownYAMLCodec.parseYamlText(settings.customMetaData); - map.forEach((key, val) { - extraProps[key] = val; - }); - } - - var folder = getFolderForEditor(settings, rootFolder, et); - return NoteEditor.newNote( - folder, - folder, - et, - existingText: sharedText, - existingImages: sharedImages, - newNoteExtraProps: extraProps, - ); - } - - assert(false, "Not found named route in _screenForRoute"); - return null; - } } diff --git a/lib/app_router.dart b/lib/app_router.dart new file mode 100644 index 00000000..943d0d57 --- /dev/null +++ b/lib/app_router.dart @@ -0,0 +1,146 @@ +import 'package:flutter/material.dart'; + +import 'package:meta/meta.dart'; + +import 'package:gitjournal/app_settings.dart'; +import 'package:gitjournal/core/md_yaml_doc_codec.dart'; +import 'package:gitjournal/screens/filesystem_screen.dart'; +import 'package:gitjournal/screens/folder_listing.dart'; +import 'package:gitjournal/screens/graph_view.dart'; +import 'package:gitjournal/screens/home_screen.dart'; +import 'package:gitjournal/screens/note_editor.dart'; +import 'package:gitjournal/screens/onboarding_screens.dart'; +import 'package:gitjournal/screens/purchase_screen.dart'; +import 'package:gitjournal/screens/purchase_thankyou_screen.dart'; +import 'package:gitjournal/screens/settings_screen.dart'; +import 'package:gitjournal/screens/tag_listing.dart'; +import 'package:gitjournal/settings.dart'; +import 'package:gitjournal/setup/screens.dart'; +import 'package:gitjournal/state_container.dart'; +import 'package:gitjournal/utils.dart'; +import 'package:gitjournal/utils/logger.dart'; + +class AppRouter { + final AppSettings appSettings; + final Settings settings; + + AppRouter({@required this.appSettings, @required this.settings}); + + String initialRoute() { + var route = '/'; + if (!appSettings.onBoardingCompleted) { + route = '/onBoarding'; + } + if (settings.homeScreen == SettingsHomeScreen.AllFolders) { + route = '/folders'; + } + return route; + } + + Route generateRoute( + RouteSettings routeSettings, + StateContainer stateContainer, + String sharedText, + List sharedImages, + ) { + var route = routeSettings.name; + if (route == '/folders' || route == '/tags' || route == '/filesystem') { + return PageRouteBuilder( + settings: routeSettings, + pageBuilder: (_, __, ___) => _screenForRoute( + route, + stateContainer, + settings, + sharedText, + sharedImages, + ), + transitionsBuilder: (_, anim, __, child) { + return FadeTransition(opacity: anim, child: child); + }, + ); + } + + return MaterialPageRoute( + settings: routeSettings, + builder: (context) => _screenForRoute( + route, + stateContainer, + settings, + sharedText, + sharedImages, + ), + ); + } + + Widget _screenForRoute( + String route, + StateContainer stateContainer, + Settings settings, + String sharedText, + List sharedImages, + ) { + switch (route) { + case '/': + return HomeScreen(); + case '/folders': + return FolderListingScreen(); + case '/filesystem': + return FileSystemScreen(); + case '/tags': + return TagListingScreen(); + case '/graph': + return GraphViewScreen(); + case '/settings': + return SettingsScreen(); + case '/setupRemoteGit': + return GitHostSetupScreen( + repoFolderName: settings.folderName, + remoteName: "origin", + onCompletedFunction: stateContainer.completeGitHostSetup, + ); + case '/onBoarding': + return OnBoardingScreen(); + case '/purchase': + return PurchaseScreen(); + case '/purchase_thank_you': + return PurchaseThankYouScreen(); + } + + if (route.startsWith('/newNote/')) { + var type = route.substring('/newNote/'.length); + var et = SettingsEditorType.fromInternalString(type).toEditorType(); + + Log.i("New Note - $route"); + Log.i("EditorType: $et"); + + var rootFolder = stateContainer.appState.notesFolder; + + sharedText = null; + sharedImages = null; + + Log.d("sharedText: $sharedText"); + Log.d("sharedImages: $sharedImages"); + + var extraProps = {}; + if (settings.customMetaData.isNotEmpty) { + var map = MarkdownYAMLCodec.parseYamlText(settings.customMetaData); + map.forEach((key, val) { + extraProps[key] = val; + }); + } + + var folder = getFolderForEditor(settings, rootFolder, et); + return NoteEditor.newNote( + folder, + folder, + et, + existingText: sharedText, + existingImages: sharedImages, + newNoteExtraProps: extraProps, + ); + } + + assert(false, "Not found named route in _screenForRoute"); + return null; + } +}