From 8ab7ec22c404c575e9291e8cb6f207f68881e94c Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Fri, 31 Jul 2020 21:16:36 +0200 Subject: [PATCH] Always check if a Folder exists before accessing it This kinds of bugs will be less frequent once we have non null by default enabled in Flutter. Fixes #164 --- lib/screens/settings_editors.dart | 10 ++++++++++ lib/screens/settings_images.dart | 18 ++++++------------ lib/screens/settings_screen.dart | 9 +++++++++ lib/utils.dart | 16 +++++++++++++--- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/screens/settings_editors.dart b/lib/screens/settings_editors.dart index 4ae14a0d..8cd59227 100644 --- a/lib/screens/settings_editors.dart +++ b/lib/screens/settings_editors.dart @@ -6,6 +6,7 @@ import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/screens/settings_screen.dart'; import 'package:gitjournal/screens/settings_widgets.dart'; import 'package:gitjournal/settings.dart'; +import 'package:gitjournal/utils.dart'; import 'package:gitjournal/widgets/folder_selection_dialog.dart'; import 'package:gitjournal/widgets/pro_overlay.dart'; @@ -22,6 +23,15 @@ class SettingsEditorsScreenState extends State { Settings.instance.journalEditordefaultNewNoteFolderSpec; if (defaultNewFolder.isEmpty) { defaultNewFolder = tr("rootFolder"); + } else { + if (!folderWithSpecExists(context, defaultNewFolder)) { + setState(() { + defaultNewFolder = tr("rootFolder"); + + Settings.instance.journalEditordefaultNewNoteFolderSpec = ""; + Settings.instance.save(); + }); + } } var body = ListView(children: [ diff --git a/lib/screens/settings_images.dart b/lib/screens/settings_images.dart index a582935f..44f484e5 100644 --- a/lib/screens/settings_images.dart +++ b/lib/screens/settings_images.dart @@ -21,6 +21,12 @@ class SettingsImagesScreenState extends State { var folder = Provider.of(context) .getFolderWithSpec(settings.imageLocationSpec); + // If the Custom Folder specified no longer exists + if (settings.imageLocationSpec != "." && folder == null) { + Settings.instance.imageLocationSpec = "."; + Settings.instance.save(); + } + var sameFolder = tr("settings.images.currentFolder"); var customFolder = tr("settings.images.customFolder"); @@ -72,15 +78,3 @@ class SettingsImagesScreenState extends State { ); } } - -// -// Options to expose -// - Image Location -// - Note Directory -// - Custom Directory -// Bool use relative path if possible -// - Image FileName -// - Original Name -// - Note FileName + _num -// - Custom Name -// diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 28a88f07..0221ff04 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -134,6 +134,15 @@ class SettingsListState extends State { var defaultNewFolder = Settings.instance.defaultNewNoteFolderSpec; if (defaultNewFolder.isEmpty) { defaultNewFolder = tr("rootFolder"); + } else { + if (!folderWithSpecExists(context, defaultNewFolder)) { + setState(() { + defaultNewFolder = tr("rootFolder"); + + Settings.instance.defaultNewNoteFolderSpec = ""; + Settings.instance.save(); + }); + } } return ListView(children: [ diff --git a/lib/utils.dart b/lib/utils.dart index 57d19071..31bca2cb 100644 --- a/lib/utils.dart +++ b/lib/utils.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:package_info/package_info.dart'; +import 'package:provider/provider.dart'; import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/screens/note_editor.dart'; @@ -50,14 +51,16 @@ NotesFolderFS getFolderForEditor( EditorType editorType, ) { var spec = Settings.instance.defaultNewNoteFolderSpec; - var journalSpec = Settings.instance.journalEditordefaultNewNoteFolderSpec; switch (editorType) { case EditorType.Journal: - return rootFolder.getFolderWithSpec(journalSpec); + spec = Settings.instance.journalEditordefaultNewNoteFolderSpec; + break; default: - return rootFolder.getFolderWithSpec(spec); + break; } + + return rootFolder.getFolderWithSpec(spec) ?? rootFolder; } Future showAlertDialog( @@ -68,3 +71,10 @@ Future showAlertDialog( ); return showDialog(context: context, builder: (context) => dialog); } + +bool folderWithSpecExists(BuildContext context, String spec) { + var stateContainer = Provider.of(context, listen: false); + var rootFolder = stateContainer.appState.notesFolder; + + return rootFolder.getFolderWithSpec(spec) != null; +}