From c4ef1f569bc36fb10b33ef8e7f1566d0964eb5a0 Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Tue, 21 Sep 2021 15:38:01 +0200 Subject: [PATCH] Use flutter_lint Instead of picking lint values. This way I don't need to routinely looking at extra lints to enable. --- analysis_options.yaml | 120 +--------- assets/langs/en.yaml | 2 + lib/account/login_screen.dart | 10 +- lib/apis/api_fakes.dart | 4 +- lib/apis/github.dart | 6 +- lib/apis/gitlab.dart | 6 +- lib/app.dart | 72 +++--- lib/app_router.dart | 6 +- lib/core/checklist.dart | 2 +- lib/core/flattened_filtered_notes_folder.dart | 4 +- lib/core/flattened_notes_folder.dart | 4 +- lib/core/graph.dart | 2 +- lib/core/link.dart | 2 +- lib/core/links_loader.dart | 4 +- lib/core/md_yaml_doc_loader.dart | 4 +- lib/core/note.dart | 4 +- lib/core/notes_cache.dart | 6 +- lib/core/notes_folder_fs.dart | 21 +- lib/core/processors/image_extractor.dart | 2 +- lib/core/views/inline_tags_view.dart | 2 +- lib/core/views/note_links_view.dart | 2 +- lib/core/views/summary_view.dart | 2 +- lib/core/worker_queue.dart | 4 +- lib/editors/autocompletion_widget.dart | 5 +- lib/editors/bottom_bar.dart | 211 +++++++++--------- lib/editors/checklist_editor.dart | 12 +- lib/editors/common.dart | 4 +- lib/editors/editor_scroll_view.dart | 5 +- lib/editors/journal_editor.dart | 20 +- lib/editors/markdown_editor.dart | 21 +- lib/editors/markdown_toolbar.dart | 13 +- lib/editors/note_body_editor.dart | 5 +- lib/editors/note_editor_selector.dart | 2 +- lib/editors/note_filename_editor.dart | 4 +- lib/editors/note_title_editor.dart | 2 +- lib/editors/org_editor.dart | 19 +- lib/editors/raw_editor.dart | 26 +-- lib/editors/scaffold.dart | 5 +- lib/editors/undo_redo.dart | 2 +- lib/experiments/main_autocomplete.dart | 14 +- lib/folder_views/card_view.dart | 2 +- lib/folder_views/common.dart | 2 +- lib/folder_views/folder_view.dart | 14 +- lib/folder_views/grid_view.dart | 2 +- lib/folder_views/journal_view.dart | 2 +- lib/folder_views/list_view.dart | 9 +- lib/folder_views/standard_view.dart | 2 +- lib/generated/locale_keys.g.dart | 2 + lib/iap/purchase_manager.dart | 2 +- lib/iap/purchase_screen.dart | 10 +- lib/iap/purchase_slider.dart | 5 +- lib/iap/purchase_widget.dart | 16 +- lib/logger/debug_screen.dart | 11 +- lib/logger/fakes/debug_screen_fake.dart | 2 +- lib/logger/logger.dart | 2 +- lib/markdown/markdown_latex.dart | 2 +- lib/repository.dart | 2 +- lib/screens/feature_timeline_screen.dart | 10 +- lib/screens/folder_listing.dart | 5 +- lib/screens/graph_view.dart | 8 +- lib/screens/note_editor.dart | 2 +- lib/screens/onboarding_screens.dart | 88 ++++---- lib/screens/onboarding_screens_stories.dart | 2 +- lib/screens/tag_listing.dart | 2 + lib/settings/settings_bottom_menu_bar.dart | 2 +- lib/settings/settings_display_images.dart | 27 +-- .../settings_display_images_caption.dart | 5 +- .../settings_display_images_theming.dart | 10 +- lib/settings/settings_experimental.dart | 6 +- lib/settings/settings_git_remote.dart | 6 +- lib/settings/settings_git_widgets.dart | 8 +- lib/settings/settings_note_metadata.dart | 33 +-- lib/settings/settings_screen.dart | 12 +- lib/settings/settings_tags.dart | 2 + lib/settings/settings_widgets.dart | 5 +- lib/setup/autoconfigure.dart | 5 +- lib/setup/button.dart | 5 +- lib/setup/clone_auto_select.dart | 2 +- ...clone_gitExec.dart => clone_git_exec.dart} | 0 lib/setup/clone_url.dart | 14 +- lib/setup/cloning.dart | 4 +- lib/setup/error.dart | 2 +- lib/setup/key_editors.dart | 6 +- lib/setup/loading.dart | 2 +- lib/setup/loading_error.dart | 2 +- lib/setup/repo_selector.dart | 9 +- lib/setup/screens.dart | 118 +++++----- lib/setup/screens_stories.dart | 12 +- lib/setup/sshkey.dart | 159 +++++++------ lib/ssh/keygen.dart | 2 +- lib/utils/merge_conflict_resolver.dart | 12 +- lib/widgets/app_drawer.dart | 4 +- lib/widgets/app_drawer_header.dart | 2 +- lib/widgets/folder_selection_dialog.dart | 12 +- lib/widgets/folder_tree_view.dart | 10 +- lib/widgets/highlighted_text.dart | 5 +- lib/widgets/images/image_caption.dart | 2 +- lib/widgets/images/image_details.dart | 2 +- lib/widgets/images/markdown_image.dart | 2 +- lib/widgets/images/themable_image.dart | 6 +- lib/widgets/journal_editor_header.dart | 2 +- lib/widgets/new_note_nav_bar.dart | 2 +- lib/widgets/note_tag_editor.dart | 7 +- lib/widgets/note_viewer.dart | 2 +- lib/widgets/notes_backlinks.dart | 10 +- lib/widgets/rename_dialog.dart | 2 +- .../scroll_view_without_animation.dart | 2 +- lib/widgets/sorting_mode_selector.dart | 2 +- lib/widgets/sync_button.dart | 4 +- pubspec.lock | 14 ++ pubspec.yaml | 1 + scripts/setup_env.dart | 3 +- test/apis/github_test.dart | 4 +- test/apis/gitlab_test.dart | 4 +- test/core/markdown_latex_test.dart | 2 +- test/core/notes_materialized_view_test.dart | 8 +- test/core/worker_queue_test.dart | 2 +- test/markdown_bug_test.dart | 4 +- test/note_storage_test.dart | 2 +- test/processors/image_extractor_test.dart | 4 +- test/processors/text_visitor_test.dart | 12 +- 121 files changed, 712 insertions(+), 761 deletions(-) rename lib/setup/{clone_gitExec.dart => clone_git_exec.dart} (100%) diff --git a/analysis_options.yaml b/analysis_options.yaml index 2e5e3a71..46b0bdd9 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -2,13 +2,8 @@ # # SPDX-License-Identifier: AGPL-3.0-or-later -# Specify analysis options. -# -# Until there are meta linter rules, each desired lint must be explicitly enabled. -# See: https://github.com/dart-lang/linter/issues/288 -# -# For a list of lints, see: http://dart-lang.github.io/linter/lints/ -# +include: package:flutter_lints/flutter.yaml + analyzer: strong-mode: implicit-dynamic: true @@ -28,111 +23,12 @@ analyzer: linter: rules: - # these rules are documented on and in the same order as - # the Dart Lint rules page to make maintenance easier - # http://dart-lang.github.io/linter/lints/ - - # === error rules === - - avoid_empty_else - - avoid_slow_async_io - - cancel_subscriptions - # - close_sinks # https://github.com/flutter/flutter/issues/5789 - # - comment_references # blocked on https://github.com/dart-lang/dartdoc/issues/1153 - - control_flow_in_finally - - empty_statements - - hash_and_equals - # - invariant_booleans # https://github.com/flutter/flutter/issues/5790 - - iterable_contains_unrelated_type - - list_remove_unrelated_type - # - literal_only_boolean_expressions # https://github.com/flutter/flutter/issues/5791 - - no_adjacent_strings_in_list - - no_duplicate_case_values - - test_types_in_equals - - throw_in_finally - - unrelated_type_equality_checks - - valid_regexps - - # === style rules === - - always_declare_return_types - # - always_put_control_body_on_new_line - - always_require_non_null_named_parameters - # - always_specify_types - - annotate_overrides - # - avoid_annotating_with_dynamic # not yet tested - # - avoid_as - # - avoid_catches_without_on_clauses # not yet tested - # - avoid_catching_errors # not yet tested - # - avoid_classes_with_only_static_members - # - avoid_function_literals_in_foreach_calls # not yet tested - - avoid_init_to_null - - avoid_null_checks_in_equality_operators - # - avoid_positional_boolean_parameters # not yet tested - - avoid_return_types_on_setters - # - avoid_returning_null # not yet tested - # - avoid_returning_this # not yet tested - # - avoid_setters_without_getters # not yet tested - # - avoid_types_on_closure_parameters # not yet tested - - await_only_futures - - camel_case_types - # - cascade_invocations # not yet tested - # - constant_identifier_names # https://github.com/dart-lang/linter/issues/204 - - directives_ordering - - empty_catches - - empty_constructor_bodies - - implementation_imports - # - join_return_with_assignment # not yet tested - - library_names - - library_prefixes - - non_constant_identifier_names - # - omit_local_variable_types # opposite of always_specify_types - # - one_member_abstracts # too many false positives - - only_throw_errors - - overridden_fields - - package_api_docs - - package_prefixed_library_names - # - parameter_assignments # we do this commonly - - prefer_adjacent_string_concatenation - - prefer_collection_literals - - prefer_conditional_assignment - - prefer_const_constructors - # - prefer_constructors_over_static_methods # not yet tested - - prefer_contains - - prefer_equal_for_default_values - # - prefer_expression_function_bodies # conflicts with https://github.com/flutter/flutter/wiki/Style-guide-for-Flutter-repo#consider-using--for-short-functions-and-methods - # - prefer_final_fields # https://github.com/dart-lang/linter/issues/506 - # - prefer_final_locals - # - prefer_foreach # not yet tested - # - prefer_function_declarations_over_variables # not yet tested - - prefer_initializing_formals - # - prefer_interpolation_to_compose_strings # not yet tested - - prefer_is_empty - - prefer_is_not_empty - - prefer_void_to_null - # - recursive_getters # https://github.com/dart-lang/linter/issues/452 - - slash_for_doc_comments - - curly_braces_in_flow_control_structures - # - sort_constructors_first - # - sort_unnamed_constructors_first - # - type_annotate_public_apis # subset of always_specify_types - - type_init_formals - # - unawaited_futures # https://github.com/flutter/flutter/issues/5793 - - unnecessary_brace_in_string_interps - - unnecessary_const - - unnecessary_getters_setters - - unnecessary_lambdas - - unnecessary_new - - unnecessary_null_aware_assignments - - unnecessary_null_in_if_null_operators - # - unnecessary_overrides # https://github.com/dart-lang/linter/issues/626 and https://github.com/dart-lang/linter/issues/627 - - unnecessary_statements - - unnecessary_this - # - use_rethrow_when_possible - # - use_setters_to_change_properties # not yet tested - # - use_string_buffers # https://github.com/dart-lang/linter/pull/664 - # - use_to_and_as_if_applicable # has false positives, so we prefer to catch this by code-review - - # === pub rules === - - package_names + avoid_print: false + constant_identifier_names: false + avoid_renaming_method_parameters: false + use_key_in_widget_constructors: false + prefer_function_declarations_over_variables: false + no_logic_in_create_state: false dart_code_metrics: metrics-exclude: diff --git a/assets/langs/en.yaml b/assets/langs/en.yaml index 30b220c2..0505e6d7 100644 --- a/assets/langs/en.yaml +++ b/assets/langs/en.yaml @@ -153,6 +153,8 @@ settings: customMetaData: title: Custom MetaData invalid: Invalid YAML + output: Output + input: Input privacy: Privacy Policy terms: Terms and Conditions experimental: diff --git a/lib/account/login_screen.dart b/lib/account/login_screen.dart index f0cab440..4b666efc 100644 --- a/lib/account/login_screen.dart +++ b/lib/account/login_screen.dart @@ -275,6 +275,8 @@ class _LoginPageState extends SupabaseAuthState { } class FormBackButton extends StatelessWidget { + const FormBackButton({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { return InkWell( @@ -284,11 +286,9 @@ class FormBackButton extends StatelessWidget { child: Container( padding: const EdgeInsets.symmetric(horizontal: 10), child: Row( - children: [ - Container( - child: const Icon(Icons.keyboard_arrow_left, color: Colors.black), - ), - const Text( + children: const [ + Icon(Icons.keyboard_arrow_left, color: Colors.black), + Text( 'Back', style: TextStyle(fontSize: 12, fontWeight: FontWeight.w500), ) diff --git a/lib/apis/api_fakes.dart b/lib/apis/api_fakes.dart index 33ffab2e..27c0b730 100644 --- a/lib/apis/api_fakes.dart +++ b/lib/apis/api_fakes.dart @@ -50,11 +50,11 @@ class GitHubFake implements GitHost { Future>> listRepos() async { List list = jsonDecode(data); var repos = []; - list.forEach((dynamic d) { + for (var d in list) { var map = Map.from(d); var repo = GitHub.repoFromJson(map); repos.add(repo); - }); + } return Result(repos); } diff --git a/lib/apis/github.dart b/lib/apis/github.dart index 536b0291..c8686f39 100644 --- a/lib/apis/github.dart +++ b/lib/apis/github.dart @@ -24,7 +24,7 @@ class GitHub implements GitHost { static const _clientID = "aa3072cbfb02b1db14ed"; static const _clientSecret = "010d303ea99f82330f2b228977cef9ddbf7af2cd"; - var _platform = const MethodChannel('gitjournal.io/git'); + final _platform = const MethodChannel('gitjournal.io/git'); var _accessCode = ""; @override @@ -116,11 +116,11 @@ class GitHub implements GitHost { List list = jsonDecode(response.body); var repos = []; - list.forEach((dynamic d) { + for (var d in list) { var map = Map.from(d); var repo = repoFromJson(map); repos.add(repo); - }); + } // FIXME: Sort these based on some criteria return Result(repos); diff --git a/lib/apis/gitlab.dart b/lib/apis/gitlab.dart index bbe65aab..121188df 100644 --- a/lib/apis/gitlab.dart +++ b/lib/apis/gitlab.dart @@ -24,7 +24,7 @@ class GitLab implements GitHost { static const _clientID = "faf33c3716faf05bfb701b1b31e36c83a23c3ec2d7161f4ff00fba2275524d09"; - var _platform = const MethodChannel('gitjournal.io/git'); + final _platform = const MethodChannel('gitjournal.io/git'); String? _accessCode = ""; var _stateOAuth = ""; @@ -101,11 +101,11 @@ class GitLab implements GitHost { List list = jsonDecode(response.body); var repos = []; - list.forEach((dynamic d) { + for (var d in list) { var map = Map.from(d); var repo = repoFromJson(map); repos.add(repo); - }); + } // FIXME: Sort these based on some criteria return Result(repos); diff --git a/lib/app.dart b/lib/app.dart index 5b9d15d1..5b7fad63 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -84,25 +84,25 @@ class JournalApp extends StatefulWidget { repoManager: repoManager, appSettings: appSettings, pref: pref, - child: JournalApp(), + child: const JournalApp(), ), - supportedLocales: [ + supportedLocales: const [ // Arranged Alphabetically - const Locale('de'), - const Locale('en'), - const Locale('es'), - const Locale('fr'), - const Locale('hu'), - const Locale('id'), - const Locale('it'), - const Locale('ja'), - const Locale('ko'), - const Locale('pl'), - const Locale('pt'), - const Locale('ru'), - const Locale('sv'), - const Locale('vi'), - const Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'), + Locale('de'), + Locale('en'), + Locale('es'), + Locale('fr'), + Locale('hu'), + Locale('id'), + Locale('it'), + Locale('ja'), + Locale('ko'), + Locale('pl'), + Locale('pt'), + Locale('ru'), + Locale('sv'), + Locale('vi'), + Locale.fromSubtags(languageCode: 'zh', scriptCode: 'Hans'), ], // Remember to update Info.plist fallbackLocale: const Locale('en'), useFallbackTranslations: true, @@ -138,7 +138,7 @@ class JournalApp extends StatefulWidget { ); } - JournalApp(); + const JournalApp({Key? key}) : super(key: key); @override _JournalAppState createState() => _JournalAppState(); @@ -160,7 +160,7 @@ class _JournalAppState extends State { return; } - final QuickActions quickActions = const QuickActions(); + const quickActions = QuickActions(); quickActions.initialize((String shortcutType) { Log.i("Quick Action Open: $shortcutType"); if (_navigatorKey.currentState == null) { @@ -205,30 +205,30 @@ class _JournalAppState extends State { } } + void _handleShare(Duration _) { + var noText = _sharedText.isEmpty; + var noImages = _sharedImages.isEmpty; + if (noText && noImages) { + return; + } + + var folderConfig = Provider.of(context, listen: false); + var editor = folderConfig.defaultEditor.toInternalString(); + _navigatorKey.currentState!.pushNamed(AppRoute.NewNotePrefix + editor); + } + void _initShareSubscriptions() { if (!Platform.isAndroid && !Platform.isIOS) { return; } - var handleShare = () { - var noText = _sharedText.isEmpty; - var noImages = _sharedImages.isEmpty; - if (noText && noImages) { - return; - } - - var folderConfig = Provider.of(context, listen: false); - var editor = folderConfig.defaultEditor.toInternalString(); - _navigatorKey.currentState!.pushNamed(AppRoute.NewNotePrefix + editor); - }; - // For sharing images coming from outside the app while the app is in the memory _intentDataStreamSubscription = ReceiveSharingIntent.getMediaStream() .listen((List value) { Log.d("Received Media Share $value"); _sharedImages = value.map((f) => f.path).toList(); - WidgetsBinding.instance!.addPostFrameCallback((_) => handleShare()); + WidgetsBinding.instance!.addPostFrameCallback(_handleShare); }, onError: (err) { Log.e("getIntentDataStream error: $err"); }); @@ -238,7 +238,7 @@ class _JournalAppState extends State { Log.d("Received MediaFile Share with App (media): $value"); _sharedImages = value.map((f) => f.path).toList(); - WidgetsBinding.instance!.addPostFrameCallback((_) => handleShare()); + WidgetsBinding.instance!.addPostFrameCallback(_handleShare); }); // For sharing or opening text coming from outside the app while the app is in the memory @@ -249,7 +249,7 @@ class _JournalAppState extends State { return; } _sharedText = value; - WidgetsBinding.instance!.addPostFrameCallback((_) => handleShare()); + WidgetsBinding.instance!.addPostFrameCallback(_handleShare); }, onError: (err) { Log.e("getLinkStream error: $err"); }); @@ -259,7 +259,7 @@ class _JournalAppState extends State { if (value == null) return; Log.d("Received Share with App (text): ${value.length}"); _sharedText = value; - WidgetsBinding.instance!.addPostFrameCallback((_) => handleShare()); + WidgetsBinding.instance!.addPostFrameCallback(_handleShare); }); } @@ -344,7 +344,7 @@ class GitJournalChangeNotifiers extends StatelessWidget { final SharedPreferences pref; final Widget child; - GitJournalChangeNotifiers({ + const GitJournalChangeNotifiers({ required this.repoManager, required this.appSettings, required this.pref, diff --git a/lib/app_router.dart b/lib/app_router.dart index e0bdc998..143c8f4f 100644 --- a/lib/app_router.dart +++ b/lib/app_router.dart @@ -131,9 +131,9 @@ class AppRouter { case AppRoute.AllFolders: return FolderListingScreen(); case AppRoute.AllTags: - return TagListingScreen(); + return const TagListingScreen(); case AppRoute.Graph: - return GraphViewScreen(); + return const GraphViewScreen(); case AppRoute.Settings: return SettingsScreen(); case AppRoute.Login: @@ -147,7 +147,7 @@ class AppRouter { onCompletedFunction: repository.completeGitHostSetup, ); case AppRoute.OnBoarding: - return OnBoardingScreen(); + return const OnBoardingScreen(); case AppRoute.Purchase: return PurchaseScreen(); case AppRoute.PurchaseThank: diff --git a/lib/core/checklist.dart b/lib/core/checklist.dart index 28084441..686ea2f7 100644 --- a/lib/core/checklist.dart +++ b/lib/core/checklist.dart @@ -61,7 +61,7 @@ class Checklist { multiLine: false, ); - Note _note; + final Note _note; List items = []; late List _lines; diff --git a/lib/core/flattened_filtered_notes_folder.dart b/lib/core/flattened_filtered_notes_folder.dart index 0d565c16..7f7c0ae7 100644 --- a/lib/core/flattened_filtered_notes_folder.dart +++ b/lib/core/flattened_filtered_notes_folder.dart @@ -21,8 +21,8 @@ class FlattenedFilteredNotesFolder final _lock = Lock(); - var _notes = []; - var _folders = []; + final _notes = []; + final _folders = []; FlattenedFilteredNotesFolder._internal( this._parentFolder, this.title, this.filter); diff --git a/lib/core/flattened_notes_folder.dart b/lib/core/flattened_notes_folder.dart index 1320d219..7cbc9b2d 100644 --- a/lib/core/flattened_notes_folder.dart +++ b/lib/core/flattened_notes_folder.dart @@ -14,8 +14,8 @@ class FlattenedNotesFolder with NotesFolderNotifier implements NotesFolder { final NotesFolder _parentFolder; final String title; - var _notes = []; - var _folders = []; + final _notes = []; + final _folders = []; FlattenedNotesFolder(this._parentFolder, {required this.title}) { _addFolder(_parentFolder); diff --git a/lib/core/graph.dart b/lib/core/graph.dart index 475e5ee4..cb6f358e 100644 --- a/lib/core/graph.dart +++ b/lib/core/graph.dart @@ -48,7 +48,7 @@ class Graph extends ChangeNotifier { List nodes = []; List edges = []; - Map> _neighbours = {}; + final Map> _neighbours = {}; Map? _nodeIndexes; late GraphNodeLayout initLayouter; diff --git a/lib/core/link.dart b/lib/core/link.dart index 7e2bf7ab..878f2727 100644 --- a/lib/core/link.dart +++ b/lib/core/link.dart @@ -156,7 +156,7 @@ class LinkExtractor implements md.NodeVisitor { /// Parse [[term]] class WikiLinkSyntax extends md.InlineSyntax { - static final String _pattern = r'\[\[([^\[\]]+)\]\]'; + static const String _pattern = r'\[\[([^\[\]]+)\]\]'; // In Obsidian style, the link is like [[fileToLinkTo|display text]] final bool obsidianStyle; diff --git a/lib/core/links_loader.dart b/lib/core/links_loader.dart index e04c9b3e..98dc72b7 100644 --- a/lib/core/links_loader.dart +++ b/lib/core/links_loader.dart @@ -17,10 +17,10 @@ import 'package:gitjournal/core/link.dart'; class LinksLoader { Isolate? _isolate; - ReceivePort _receivePort = ReceivePort(); + final _receivePort = ReceivePort(); SendPort? _sendPort; - var _loadingLock = Lock(); + final _loadingLock = Lock(); Future _initIsolate() async { if (_isolate != null && _sendPort != null) return; diff --git a/lib/core/md_yaml_doc_loader.dart b/lib/core/md_yaml_doc_loader.dart index 7d812ba6..7c2f1fdc 100644 --- a/lib/core/md_yaml_doc_loader.dart +++ b/lib/core/md_yaml_doc_loader.dart @@ -15,10 +15,10 @@ import 'package:gitjournal/core/md_yaml_doc_codec.dart'; class MdYamlDocLoader { Isolate? _isolate; - ReceivePort _receivePort = ReceivePort(); + final _receivePort = ReceivePort(); SendPort? _sendPort; - var _loadingLock = Lock(); + final _loadingLock = Lock(); Future _initIsolate() async { if (_isolate != null && _sendPort != null) return; diff --git a/lib/core/note.dart b/lib/core/note.dart index 56b53c20..15d37da1 100644 --- a/lib/core/note.dart +++ b/lib/core/note.dart @@ -16,8 +16,8 @@ import 'package:gitjournal/utils/datetime.dart'; import 'md_yaml_doc.dart'; import 'note_serializer.dart'; -typedef void NoteSelectedFunction(Note note); -typedef bool NoteBoolPropertyFunction(Note note); +typedef NoteSelectedFunction = void Function(Note note); +typedef NoteBoolPropertyFunction = bool Function(Note note); /// Move this to NotesFolderFS enum NoteLoadState { diff --git a/lib/core/notes_cache.dart b/lib/core/notes_cache.dart index 7e8d0760..453737cc 100644 --- a/lib/core/notes_cache.dart +++ b/lib/core/notes_cache.dart @@ -104,12 +104,14 @@ class NotesCache { SortingMode sortingMode, ) { var origFn = sortingMode.sortingFunction(); - var reversedFn = (Note a, Note b) { + + reversedFn(Note a, Note b) { var r = origFn(a, b); if (r < 0) return 1; if (r > 0) return -1; return 0; - }; + } + var heap = HeapPriorityQueue(reversedFn); for (var note in allNotes) { diff --git a/lib/core/notes_folder_fs.dart b/lib/core/notes_folder_fs.dart index 1f491c3d..5870df63 100644 --- a/lib/core/notes_folder_fs.dart +++ b/lib/core/notes_folder_fs.dart @@ -39,20 +39,22 @@ class IgnoredFile { class NotesFolderFS with NotesFolderNotifier implements NotesFolder { final NotesFolderFS? _parent; String _folderPath; - var _lock = Lock(); + final _lock = Lock(); - List _notes = []; - List _folders = []; + final _notes = []; + final _folders = []; List _ignoredFiles = []; - Map _entityMap = {}; - NotesFolderConfig _config; + final _entityMap = {}; + final NotesFolderConfig _config; NotesFolderFS(this._parent, this._folderPath, this._config); @override void dispose() { - _folders.forEach((f) => f.removeListener(_entityChanged)); + for (var f in _folders) { + f.removeListener(_entityChanged); + } super.dispose(); } @@ -184,7 +186,8 @@ class NotesFolderFS with NotesFolderNotifier implements NotesFolder { // Remove notes which have errors await _lock.synchronized(() { - var errFunc = (Note n) => n.loadState == NoteLoadState.Error; + errFunc(Note n) => n.loadState == NoteLoadState.Error; + var hasBadNotes = _notes.any(errFunc); if (hasBadNotes) { while (true) { @@ -292,7 +295,7 @@ class NotesFolderFS with NotesFolderNotifier implements NotesFolder { } Set pathsRemoved = _entityMap.keys.toSet().difference(pathsFound); - pathsRemoved.forEach((path) { + for (var path in pathsRemoved) { var e = _entityMap[path]; assert(e != null); @@ -316,7 +319,7 @@ class NotesFolderFS with NotesFolderNotifier implements NotesFolder { _folders.removeAt(i); notifyFolderRemoved(i, folder); } - }); + } } void add(Note note) { diff --git a/lib/core/processors/image_extractor.dart b/lib/core/processors/image_extractor.dart index 8af359fd..c0cac175 100644 --- a/lib/core/processors/image_extractor.dart +++ b/lib/core/processors/image_extractor.dart @@ -10,7 +10,7 @@ class NoteImage extends Equatable { final String url; final String alt; - NoteImage({required this.url, required this.alt}); + const NoteImage({required this.url, required this.alt}); @override List get props => [url, alt]; diff --git a/lib/core/views/inline_tags_view.dart b/lib/core/views/inline_tags_view.dart index 1aa502d9..3db6d7d3 100644 --- a/lib/core/views/inline_tags_view.dart +++ b/lib/core/views/inline_tags_view.dart @@ -18,7 +18,7 @@ typedef InlineTagsView = NotesMaterializedView>; class InlineTagsProvider extends SingleChildStatelessWidget { final String repoPath; - InlineTagsProvider({ + const InlineTagsProvider({ Key? key, Widget? child, required this.repoPath, diff --git a/lib/core/views/note_links_view.dart b/lib/core/views/note_links_view.dart index c3940515..36153f9e 100644 --- a/lib/core/views/note_links_view.dart +++ b/lib/core/views/note_links_view.dart @@ -41,7 +41,7 @@ class NoteLinksView extends NotesMaterializedView<_LinksList> { class NoteLinksProvider extends SingleChildStatelessWidget { final String repoPath; - NoteLinksProvider({ + const NoteLinksProvider({ Key? key, Widget? child, required this.repoPath, diff --git a/lib/core/views/summary_view.dart b/lib/core/views/summary_view.dart index 6e835323..3ac9d2ee 100644 --- a/lib/core/views/summary_view.dart +++ b/lib/core/views/summary_view.dart @@ -18,7 +18,7 @@ typedef NotesSummaryView = NotesMaterializedView; class NoteSummaryProvider extends SingleChildStatelessWidget { final String repoPath; - NoteSummaryProvider({ + const NoteSummaryProvider({ Key? key, Widget? child, required this.repoPath, diff --git a/lib/core/worker_queue.dart b/lib/core/worker_queue.dart index 4161799b..1af4ee76 100644 --- a/lib/core/worker_queue.dart +++ b/lib/core/worker_queue.dart @@ -15,8 +15,8 @@ class WorkerQueue { Isolate? _isolate; SendPort? _sendPort; - var _receivePort = ReceivePort(); - var _loadingLock = Lock(); + final _receivePort = ReceivePort(); + final _loadingLock = Lock(); Func1 func; diff --git a/lib/editors/autocompletion_widget.dart b/lib/editors/autocompletion_widget.dart index 8a5a1bcf..5b11d354 100644 --- a/lib/editors/autocompletion_widget.dart +++ b/lib/editors/autocompletion_widget.dart @@ -20,14 +20,15 @@ class AutoCompletionWidget extends StatefulWidget { final Widget child; final List tags; - AutoCompletionWidget({ + const AutoCompletionWidget({ + Key? key, required this.textFieldFocusNode, required this.textFieldKey, required this.textFieldStyle, required this.textController, required this.child, required this.tags, - }); + }) : super(key: key); @override _AutoCompletionWidgetState createState() => _AutoCompletionWidgetState(); diff --git a/lib/editors/bottom_bar.dart b/lib/editors/bottom_bar.dart index dc822d9d..114d7983 100644 --- a/lib/editors/bottom_bar.dart +++ b/lib/editors/bottom_bar.dart @@ -35,7 +35,8 @@ class EditorBottomBar extends StatelessWidget { final Func0 onUndoSelected; final Func0 onRedoSelected; - EditorBottomBar({ + const EditorBottomBar({ + Key? key, required this.editor, required this.editorState, required this.parentFolder, @@ -47,7 +48,7 @@ class EditorBottomBar extends StatelessWidget { required this.onRedoSelected, required this.undoAllowed, required this.redoAllowed, - }); + }) : super(key: key); @override Widget build(BuildContext context) { @@ -136,52 +137,50 @@ class AddBottomSheet extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: const Icon(Icons.camera), - title: Text(tr(LocaleKeys.editors_common_takePhoto)), - onTap: () async { - try { - var image = await ImagePicker().pickImage( - source: ImageSource.camera, - ); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: const Icon(Icons.camera), + title: Text(tr(LocaleKeys.editors_common_takePhoto)), + onTap: () async { + try { + var image = await ImagePicker().pickImage( + source: ImageSource.camera, + ); - if (image != null) { - await editorState.addImage(image.path); - } - } catch (e) { - reportError(e, StackTrace.current); + if (image != null) { + await editorState.addImage(image.path); } - Navigator.of(context).pop(); - }, - ), - ListTile( - leading: const Icon(Icons.image), - title: Text(tr(LocaleKeys.editors_common_addImage)), - onTap: () async { - try { - var image = await ImagePicker().pickImage( - source: ImageSource.gallery, - ); + } catch (e) { + reportError(e, StackTrace.current); + } + Navigator.of(context).pop(); + }, + ), + ListTile( + leading: const Icon(Icons.image), + title: Text(tr(LocaleKeys.editors_common_addImage)), + onTap: () async { + try { + var image = await ImagePicker().pickImage( + source: ImageSource.gallery, + ); - if (image != null) { - await editorState.addImage(image.path); - } - } catch (e) { - if (e is PlatformException && e.code == "photo_access_denied") { - Navigator.of(context).pop(); - return; - } - reportError(e, StackTrace.current); + if (image != null) { + await editorState.addImage(image.path); } - Navigator.of(context).pop(); - }, - ), - ], - ), + } catch (e) { + if (e is PlatformException && e.code == "photo_access_denied") { + Navigator.of(context).pop(); + return; + } + reportError(e, StackTrace.current); + } + Navigator.of(context).pop(); + }, + ), + ], ); } } @@ -204,48 +203,71 @@ class BottomMenuSheet extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - ListTile( - leading: const Icon(Icons.undo), - title: Text(tr(LocaleKeys.editors_common_discard)), - onTap: () { - var note = editorState.getNote(); - Navigator.of(context).pop(); + return Column( + mainAxisSize: MainAxisSize.min, + children: [ + ListTile( + leading: const Icon(Icons.undo), + title: Text(tr(LocaleKeys.editors_common_discard)), + onTap: () { + var note = editorState.getNote(); + Navigator.of(context).pop(); - editor.common.discardChanges(note); - }, - enabled: editorState.noteModified, - ), - ListTile( - leading: const Icon(Icons.share), - title: Text(tr(LocaleKeys.editors_common_share)), - onTap: () { - var note = editorState.getNote(); - Navigator.of(context).pop(); + editor.common.discardChanges(note); + }, + enabled: editorState.noteModified, + ), + ListTile( + leading: const Icon(Icons.share), + title: Text(tr(LocaleKeys.editors_common_share)), + onTap: () { + var note = editorState.getNote(); + Navigator.of(context).pop(); - shareNote(note); - }, - ), - if (metaDataEditable) - ProOverlay( - feature: Feature.tags, - child: ListTile( - leading: const FaIcon(FontAwesomeIcons.tag), - title: Text(tr(LocaleKeys.editors_common_tags)), - onTap: () { - var note = editorState.getNote(); - Navigator.of(context).pop(); + shareNote(note); + }, + ), + if (metaDataEditable) + ProOverlay( + feature: Feature.tags, + child: ListTile( + leading: const FaIcon(FontAwesomeIcons.tag), + title: Text(tr(LocaleKeys.editors_common_tags)), + onTap: () { + var note = editorState.getNote(); + Navigator.of(context).pop(); - editor.common.editTags(note); - }, - ), + editor.common.editTags(note); + }, ), + ), + ListTile( + leading: const Icon(Icons.edit), + title: Text(tr(LocaleKeys.editors_common_editFileName)), + onTap: () { + var note = editorState.getNote(); + Navigator.of(context).pop(); + + editor.common.renameNote(note); + }, + ), + ProOverlay( + feature: Feature.zenMode, + child: ListTile( + leading: const FaIcon(FontAwesomeIcons.peace), + title: Text(tr(zenModeEnabled + ? LocaleKeys.editors_common_zen_disable + : LocaleKeys.editors_common_zen_enable)), + onTap: () { + zenModeChanged(); + Navigator.of(context).pop(); + }, + ), + ), + if (Features.findInNote) ListTile( - leading: const Icon(Icons.edit), - title: Text(tr(LocaleKeys.editors_common_editFileName)), + leading: const Icon(Icons.search), + title: Text(tr(LocaleKeys.editors_common_find)), onTap: () { var note = editorState.getNote(); Navigator.of(context).pop(); @@ -253,32 +275,7 @@ class BottomMenuSheet extends StatelessWidget { editor.common.renameNote(note); }, ), - ProOverlay( - feature: Feature.zenMode, - child: ListTile( - leading: const FaIcon(FontAwesomeIcons.peace), - title: Text(tr(zenModeEnabled - ? LocaleKeys.editors_common_zen_disable - : LocaleKeys.editors_common_zen_enable)), - onTap: () { - zenModeChanged(); - Navigator.of(context).pop(); - }, - ), - ), - if (Features.findInNote) - ListTile( - leading: const Icon(Icons.search), - title: Text(tr(LocaleKeys.editors_common_find)), - onTap: () { - var note = editorState.getNote(); - Navigator.of(context).pop(); - - editor.common.renameNote(note); - }, - ), - ], - ), + ], ); } } diff --git a/lib/editors/checklist_editor.dart b/lib/editors/checklist_editor.dart index 5c7c0d96..93146d9b 100644 --- a/lib/editors/checklist_editor.dart +++ b/lib/editors/checklist_editor.dart @@ -32,7 +32,7 @@ class ChecklistEditor extends StatefulWidget implements Editor { final String? highlightString; final ThemeData theme; - ChecklistEditor({ + const ChecklistEditor({ Key? key, required this.note, required this.noteModified, @@ -328,7 +328,7 @@ class ChecklistItemTile extends StatefulWidget { final String? highlightString; final ThemeData theme; - ChecklistItemTile({ + const ChecklistItemTile({ Key? key, required this.item, required this.statusChanged, @@ -404,10 +404,10 @@ class _ChecklistItemTileState extends State { dense: true, leading: Row( children: [ - Container( + const SizedBox( height: 24.0, width: 24.0, - child: const Icon(Icons.drag_handle), + child: Icon(Icons.drag_handle), ), const SizedBox(width: 8.0), SizedBox( @@ -434,7 +434,7 @@ class _ChecklistItemTileState extends State { class AddItemButton extends StatelessWidget { final void Function() onPressed; - AddItemButton({Key? key, required this.onPressed}) : super(key: key); + const AddItemButton({Key? key, required this.onPressed}) : super(key: key); @override Widget build(BuildContext context) { @@ -444,7 +444,7 @@ class AddItemButton extends StatelessWidget { dense: true, leading: Row( children: [ - Container(height: 24.0, width: 24.0), + const SizedBox(height: 24.0, width: 24.0), const SizedBox(width: 8.0), Container( padding: const EdgeInsets.all(0.0), diff --git a/lib/editors/common.dart b/lib/editors/common.dart index 41c0ab07..1305c031 100644 --- a/lib/editors/common.dart +++ b/lib/editors/common.dart @@ -67,7 +67,7 @@ class EditorAppBar extends StatelessWidget implements PreferredSizeWidget { final bool allowEdits; final Func0 onEditingModeChange; - EditorAppBar({ + const EditorAppBar({ Key? key, required this.editor, required this.editorState, @@ -127,7 +127,7 @@ class EditorAppSearchBar extends StatelessWidget final IconButton? extraButton; final Func0 onEditingModeChange; - EditorAppSearchBar({ + const EditorAppSearchBar({ Key? key, required this.editor, required this.editorState, diff --git a/lib/editors/editor_scroll_view.dart b/lib/editors/editor_scroll_view.dart index b0a5cb3b..36684688 100644 --- a/lib/editors/editor_scroll_view.dart +++ b/lib/editors/editor_scroll_view.dart @@ -12,10 +12,11 @@ class EditorScrollView extends StatelessWidget { final Widget child; final EdgeInsetsGeometry padding; - EditorScrollView({ + const EditorScrollView({ + Key? key, required this.child, this.padding = const EdgeInsets.all(16.0), - }); + }) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/editors/journal_editor.dart b/lib/editors/journal_editor.dart index aef5639f..fcf404f8 100644 --- a/lib/editors/journal_editor.dart +++ b/lib/editors/journal_editor.dart @@ -29,7 +29,7 @@ class JournalEditor extends StatefulWidget implements Editor { @override final EditorCommon common; - JournalEditor({ + const JournalEditor({ Key? key, required this.note, required this.noteModified, @@ -41,31 +41,31 @@ class JournalEditor extends StatefulWidget implements Editor { @override JournalEditorState createState() { - return JournalEditorState(note); + return JournalEditorState(); } } class JournalEditorState extends State with DisposableChangeNotifier implements EditorState { - Note note; + late Note _note; late TextEditingController _textController; late bool _noteModified; late EditorHeuristics _heuristics; - JournalEditorState(this.note); @override void initState() { super.initState(); + _note = widget.note; _noteModified = widget.noteModified; _textController = buildController( - text: note.body, + text: _note.body, highlightText: widget.highlightString, theme: widget.theme, ); - _heuristics = EditorHeuristics(text: note.body); + _heuristics = EditorHeuristics(text: _note.body); } @override @@ -90,7 +90,7 @@ class JournalEditorState extends State var editor = EditorScrollView( child: Column( children: [ - JournalEditorHeader(note), + JournalEditorHeader(_note), NoteBodyEditor( textController: _textController, autofocus: widget.editMode, @@ -105,7 +105,7 @@ class JournalEditorState extends State editorState: this, noteModified: _noteModified, editMode: widget.editMode, - parentFolder: note.parent, + parentFolder: _note.parent, body: editor, onUndoSelected: _undo, onRedoSelected: _redo, @@ -116,11 +116,11 @@ class JournalEditorState extends State @override Note getNote() { - note.apply( + _note.apply( body: _textController.text.trim(), type: NoteType.Journal, ); - return note; + return _note; } void _noteTextChanged() { diff --git a/lib/editors/markdown_editor.dart b/lib/editors/markdown_editor.dart index 2ef0468c..1602d3bd 100644 --- a/lib/editors/markdown_editor.dart +++ b/lib/editors/markdown_editor.dart @@ -35,7 +35,7 @@ class MarkdownEditor extends StatefulWidget implements Editor { final String? highlightString; final ThemeData theme; - MarkdownEditor({ + const MarkdownEditor({ Key? key, required this.note, required this.parentFolder, @@ -48,14 +48,14 @@ class MarkdownEditor extends StatefulWidget implements Editor { @override MarkdownEditorState createState() { - return MarkdownEditorState(note); + return MarkdownEditorState(); } } class MarkdownEditorState extends State with DisposableChangeNotifier implements EditorState { - Note note; + late Note _note; late TextEditingController _textController; late TextEditingController _titleTextController; @@ -63,25 +63,24 @@ class MarkdownEditorState extends State late bool _noteModified; - MarkdownEditorState(this.note); - @override void initState() { super.initState(); + _note = widget.note; _noteModified = widget.noteModified; _textController = buildController( - text: note.body, + text: _note.body, highlightText: widget.highlightString, theme: widget.theme, ); _titleTextController = buildController( - text: note.title, + text: _note.title, highlightText: widget.highlightString, theme: widget.theme, ); - _heuristics = EditorHeuristics(text: note.body); + _heuristics = EditorHeuristics(text: _note.body); } @override @@ -133,7 +132,7 @@ class MarkdownEditorState extends State editorState: this, noteModified: _noteModified, editMode: widget.editMode, - parentFolder: note.parent, + parentFolder: _note.parent, body: editor, onUndoSelected: _undo, onRedoSelected: _redo, @@ -144,7 +143,7 @@ class MarkdownEditorState extends State } void _updateNote() { - note.apply( + _note.apply( body: _textController.text.trim(), title: _titleTextController.text.trim(), type: NoteType.Unknown, @@ -154,7 +153,7 @@ class MarkdownEditorState extends State @override Note getNote() { _updateNote(); - return note; + return _note; } void _noteTextChanged() { diff --git a/lib/editors/markdown_toolbar.dart b/lib/editors/markdown_toolbar.dart index 36096c46..5526ab2a 100644 --- a/lib/editors/markdown_toolbar.dart +++ b/lib/editors/markdown_toolbar.dart @@ -20,9 +20,10 @@ import 'package:gitjournal/forks/icon_button_more_gestures.dart' as fork; class MarkdownToolBar extends StatelessWidget { final TextEditingController textController; - MarkdownToolBar({ + const MarkdownToolBar({ + Key? key, required this.textController, - }); + }) : super(key: key); @override Widget build(BuildContext context) { @@ -63,9 +64,9 @@ class MarkdownToolBar extends StatelessWidget { padding: const EdgeInsets.all(0.0), onPressed: () => _modifyCurrentLine('- [ ] '), ), - Container( + const SizedBox( height: 20, - child: const VerticalDivider(), + child: VerticalDivider(), ), fork.IconButton( icon: const Icon(Icons.navigate_before), @@ -135,8 +136,8 @@ final _allowedBlockTags = [ ]; final _allowedBlockRegExps = [ - RegExp('- \[[xX ]\] '), - RegExp('\d+\. '), + RegExp('- [[xX ]] '), + RegExp('d+. '), ]; TextEditingValue modifyCurrentLine( diff --git a/lib/editors/note_body_editor.dart b/lib/editors/note_body_editor.dart index 8bc9907e..b8996d6c 100644 --- a/lib/editors/note_body_editor.dart +++ b/lib/editors/note_body_editor.dart @@ -15,11 +15,12 @@ class NoteBodyEditor extends StatelessWidget { final bool autofocus; final Function onChanged; - NoteBodyEditor({ + const NoteBodyEditor({ + Key? key, required this.textController, required this.autofocus, required this.onChanged, - }); + }) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/editors/note_editor_selector.dart b/lib/editors/note_editor_selector.dart index 78e496e2..08ab0764 100644 --- a/lib/editors/note_editor_selector.dart +++ b/lib/editors/note_editor_selector.dart @@ -17,7 +17,7 @@ class NoteEditorSelector extends StatelessWidget { final EditorType currentEditor; final NoteFileFormat fileFormat; - NoteEditorSelector(this.currentEditor, this.fileFormat); + const NoteEditorSelector(this.currentEditor, this.fileFormat); @override Widget build(BuildContext context) { diff --git a/lib/editors/note_filename_editor.dart b/lib/editors/note_filename_editor.dart index 8d39fc07..19af297b 100644 --- a/lib/editors/note_filename_editor.dart +++ b/lib/editors/note_filename_editor.dart @@ -22,11 +22,13 @@ class NoteFileNameEditor extends StatefulWidget { final String dirName; NoteFileNameEditor({ + Key? key, required this.filePath, required this.fs, required this.onChanged, }) : fileName = p.basename(filePath), - dirName = p.dirname(filePath); + dirName = p.dirname(filePath), + super(key: key); @override _NoteFileNameEditorState createState() => _NoteFileNameEditorState(); diff --git a/lib/editors/note_title_editor.dart b/lib/editors/note_title_editor.dart index 8fe393e4..09925215 100644 --- a/lib/editors/note_title_editor.dart +++ b/lib/editors/note_title_editor.dart @@ -14,7 +14,7 @@ class NoteTitleEditor extends StatelessWidget { final TextEditingController textController; final Function onChanged; - NoteTitleEditor(this.textController, this.onChanged); + const NoteTitleEditor(this.textController, this.onChanged); @override Widget build(BuildContext context) { diff --git a/lib/editors/org_editor.dart b/lib/editors/org_editor.dart index e9d5d5d0..4e17afc8 100644 --- a/lib/editors/org_editor.dart +++ b/lib/editors/org_editor.dart @@ -30,7 +30,7 @@ class OrgEditor extends StatefulWidget implements Editor { final String? highlightString; final ThemeData theme; - OrgEditor({ + const OrgEditor({ Key? key, required this.note, required this.noteModified, @@ -42,28 +42,27 @@ class OrgEditor extends StatefulWidget implements Editor { @override OrgEditorState createState() { - return OrgEditorState(note); + return OrgEditorState(); } } class OrgEditorState extends State with DisposableChangeNotifier implements EditorState { - Note note; + late Note _note; late bool _noteModified; late TextEditingController _textController; late UndoRedoStack _undoRedoStack; final serializer = MarkdownYAMLCodec(); - OrgEditorState(this.note); - @override void initState() { super.initState(); + _note = widget.note; _noteModified = widget.noteModified; _textController = buildController( - text: serializer.encode(note.data), + text: serializer.encode(_note.data), highlightText: widget.highlightString, theme: widget.theme, ); @@ -102,7 +101,7 @@ class OrgEditorState extends State editorState: this, noteModified: _noteModified, editMode: widget.editMode, - parentFolder: note.parent, + parentFolder: _note.parent, body: editor, onUndoSelected: _undo, onRedoSelected: _redo, @@ -113,8 +112,8 @@ class OrgEditorState extends State @override Note getNote() { - note.data = serializer.decode(_textController.text); - return note; + _note.data = serializer.decode(_textController.text); + return _note; } void _noteTextChanged() { @@ -169,7 +168,7 @@ class _NoteEditor extends StatelessWidget { final bool autofocus; final Function onChanged; - _NoteEditor({ + const _NoteEditor({ required this.textController, required this.autofocus, required this.onChanged, diff --git a/lib/editors/raw_editor.dart b/lib/editors/raw_editor.dart index c5c58bdf..81c24880 100644 --- a/lib/editors/raw_editor.dart +++ b/lib/editors/raw_editor.dart @@ -36,7 +36,7 @@ class RawEditor extends StatefulWidget implements Editor { final String? highlightString; final ThemeData theme; - RawEditor({ + const RawEditor({ Key? key, required this.note, required this.noteModified, @@ -48,29 +48,28 @@ class RawEditor extends StatefulWidget implements Editor { @override RawEditorState createState() { - return RawEditorState(note); + return RawEditorState(); } } class RawEditorState extends State with DisposableChangeNotifier implements EditorState { - Note note; + late Note _note; late bool _noteModified; late TextEditingController _textController; late UndoRedoStack _undoRedoStack; final serializer = MarkdownYAMLCodec(); - RawEditorState(this.note); - @override void initState() { super.initState(); + _note = widget.note; _noteModified = widget.noteModified; _textController = buildController( - text: serializer.encode(note.data), + text: serializer.encode(_note.data), highlightText: widget.highlightString, theme: widget.theme, ); @@ -110,7 +109,7 @@ class RawEditorState extends State editorState: this, noteModified: _noteModified, editMode: widget.editMode, - parentFolder: note.parent, + parentFolder: _note.parent, body: editor, onUndoSelected: _undo, onRedoSelected: _redo, @@ -121,8 +120,8 @@ class RawEditorState extends State @override Note getNote() { - note.data = serializer.decode(_textController.text); - return note; + _note.data = serializer.decode(_textController.text); + return _note; } void _noteTextChanged() { @@ -177,7 +176,7 @@ class _NoteEditor extends StatefulWidget { final bool autofocus; final Function onChanged; - _NoteEditor({ + const _NoteEditor({ required this.textController, required this.autofocus, required this.onChanged, @@ -231,8 +230,9 @@ class _NoteEditorState extends State<_NoteEditor> { } final rootFolder = Provider.of(context, listen: false); - var inlineTagsView = InlineTagsProvider.of(context); - var futureBuilder = () async { + final inlineTagsView = InlineTagsProvider.of(context); + + futureBuilder() async { var allTags = await rootFolder.getNoteTagsRecursively(inlineTagsView); Log.d("Building autocompleter with $allTags"); @@ -244,7 +244,7 @@ class _NoteEditorState extends State<_NoteEditor> { child: textField, tags: allTags.toList(), ); - }; + } return FutureBuilderWithProgress(future: futureBuilder()); } diff --git a/lib/editors/scaffold.dart b/lib/editors/scaffold.dart index 15a0c257..2089f972 100644 --- a/lib/editors/scaffold.dart +++ b/lib/editors/scaffold.dart @@ -35,7 +35,7 @@ class EditorScaffold extends StatefulWidget { final Widget? extraBottomWidget; - EditorScaffold({ + const EditorScaffold({ required this.editor, required this.editorState, required this.noteModified, @@ -196,7 +196,8 @@ class _AnimatedOpacityIgnorePointer extends StatelessWidget { final bool visible; final Widget child; - _AnimatedOpacityIgnorePointer({required this.visible, required this.child}); + const _AnimatedOpacityIgnorePointer( + {required this.visible, required this.child}); @override Widget build(BuildContext context) { diff --git a/lib/editors/undo_redo.dart b/lib/editors/undo_redo.dart index 4ce96258..900afdfc 100644 --- a/lib/editors/undo_redo.dart +++ b/lib/editors/undo_redo.dart @@ -18,7 +18,7 @@ import 'package:gitjournal/editors/common.dart'; // be just taken from this class // class UndoRedoStack { - var _versions = []; + final _versions = []; int _index = -1; /// Returns if UI should be redrawn diff --git a/lib/experiments/main_autocomplete.dart b/lib/experiments/main_autocomplete.dart index 79987d65..a2053fff 100644 --- a/lib/experiments/main_autocomplete.dart +++ b/lib/experiments/main_autocomplete.dart @@ -18,13 +18,13 @@ class MyApp extends StatelessWidget { theme: ThemeData( primarySwatch: Colors.blue, ), - home: MyHomePage(title: 'AutoCompleter'), + home: const MyHomePage(title: 'AutoCompleter'), ); } } class MyHomePage extends StatefulWidget { - MyHomePage({Key? key, this.title}) : super(key: key); + const MyHomePage({Key? key, this.title}) : super(key: key); final String? title; @@ -33,9 +33,9 @@ class MyHomePage extends StatefulWidget { } class _MyHomePageState extends State { - FocusNode _focusNode = FocusNode(); - GlobalKey _textFieldKey = GlobalKey(); - TextStyle _textFieldStyle = const TextStyle(fontSize: 20); + final FocusNode _focusNode = FocusNode(); + final GlobalKey _textFieldKey = GlobalKey(); + final TextStyle _textFieldStyle = const TextStyle(fontSize: 20); TextEditingController? _textController; @@ -62,7 +62,7 @@ class _MyHomePageState extends State { textFieldFocusNode: _focusNode, textController: _textController!, child: textField, - tags: ['Hello', 'Howdy', 'Pooper'], + tags: const ['Hello', 'Howdy', 'Pooper'], ); return Scaffold( appBar: AppBar( @@ -70,7 +70,7 @@ class _MyHomePageState extends State { ), body: Center( child: SingleChildScrollView( - child: Container( + child: SizedBox( child: textField, width: 400.0, ), diff --git a/lib/folder_views/card_view.dart b/lib/folder_views/card_view.dart index 97169381..73d7abb8 100644 --- a/lib/folder_views/card_view.dart +++ b/lib/folder_views/card_view.dart @@ -24,7 +24,7 @@ class CardView extends StatelessWidget { final String searchTerm; - CardView({ + const CardView({ required this.folder, required this.noteTapped, required this.noteLongPressed, diff --git a/lib/folder_views/common.dart b/lib/folder_views/common.dart index 433f54af..da6d26a5 100644 --- a/lib/folder_views/common.dart +++ b/lib/folder_views/common.dart @@ -131,7 +131,7 @@ bool openNewNoteEditor(BuildContext context, String noteSpec) { defaultEditor, newNoteFileName: fileName, existingText: "", - existingImages: [], + existingImages: const [], ), AppRoute.NewNotePrefix + folderConfig.defaultEditor.toInternalString(), ); diff --git a/lib/folder_views/folder_view.dart b/lib/folder_views/folder_view.dart index fa6da33d..bb15379b 100644 --- a/lib/folder_views/folder_view.dart +++ b/lib/folder_views/folder_view.dart @@ -45,7 +45,7 @@ class FolderView extends StatefulWidget { final NotesFolder notesFolder; final Map newNoteExtraProps; - FolderView({ + const FolderView({ required this.notesFolder, this.newNoteExtraProps = const {}, }); @@ -250,7 +250,7 @@ class _FolderViewState extends State { editorType, newNoteExtraProps: extraProps, existingText: "", - existingImages: [], + existingImages: const [], ), AppRoute.NewNotePrefix + routeType, ); @@ -281,7 +281,7 @@ class _FolderViewState extends State { await showDialog( context: context, builder: (BuildContext context) { - var headerTypeChanged = (StandardViewHeader? newHeader) { + void headerTypeChanged(StandardViewHeader? newHeader) { if (newHeader == null) { return; } @@ -292,9 +292,9 @@ class _FolderViewState extends State { var folderConfig = sortedNotesFolder.config; folderConfig.viewHeader = _headerType; folderConfig.save(); - }; + } - var summaryChanged = (bool newVal) { + void summaryChanged(bool newVal) { setState(() { _showSummary = newVal; }); @@ -302,7 +302,7 @@ class _FolderViewState extends State { var folderConfig = sortedNotesFolder.config; folderConfig.showNoteSummary = newVal; folderConfig.save(); - }; + } return StatefulBuilder( builder: (BuildContext context, Function setState) { @@ -383,7 +383,7 @@ class _FolderViewState extends State { } void _folderViewChooserSelected() async { - var onViewChange = (FolderViewType? vt) => Navigator.of(context).pop(vt); + void onViewChange(FolderViewType? vt) => Navigator.of(context).pop(vt); var newViewType = await showDialog( context: context, diff --git a/lib/folder_views/grid_view.dart b/lib/folder_views/grid_view.dart index 16091523..56ac0558 100644 --- a/lib/folder_views/grid_view.dart +++ b/lib/folder_views/grid_view.dart @@ -20,7 +20,7 @@ class GridFolderView extends StatelessWidget { final String searchTerm; - GridFolderView({ + const GridFolderView({ required this.folder, required this.noteTapped, required this.noteLongPressed, diff --git a/lib/folder_views/journal_view.dart b/lib/folder_views/journal_view.dart index 91a39ed5..7987d858 100644 --- a/lib/folder_views/journal_view.dart +++ b/lib/folder_views/journal_view.dart @@ -114,7 +114,7 @@ class JournalView extends StatelessWidget { ); var dc = Theme.of(context).dividerColor; - var divider = Container( + var divider = SizedBox( height: 1.0, child: Divider(color: dc.withOpacity(dc.opacity / 3)), ); diff --git a/lib/folder_views/list_view.dart b/lib/folder_views/list_view.dart index 4fe1a3a6..f9d4723a 100644 --- a/lib/folder_views/list_view.dart +++ b/lib/folder_views/list_view.dart @@ -17,7 +17,7 @@ import 'package:gitjournal/utils/utils.dart'; import 'package:gitjournal/widgets/icon_dismissable.dart'; import 'empty_text_sliver.dart'; -typedef Widget NoteTileBuilder(BuildContext context, Note note); +typedef NoteTileBuilder = Widget Function(BuildContext context, Note note); class FolderListView extends StatefulWidget { final NoteTileBuilder noteTileBuilder; @@ -26,20 +26,21 @@ class FolderListView extends StatefulWidget { final String emptyText; final String searchTerm; - FolderListView({ + const FolderListView({ required this.folder, required this.noteTileBuilder, required this.emptyText, required this.isNoteSelected, required this.searchTerm, - }); + Key? key, + }) : super(key: key); @override _FolderListViewState createState() => _FolderListViewState(); } class _FolderListViewState extends State { - var _listKey = GlobalKey(); + final _listKey = GlobalKey(); var deletedViaDismissed = []; @override diff --git a/lib/folder_views/standard_view.dart b/lib/folder_views/standard_view.dart index 111c0d88..e028e682 100644 --- a/lib/folder_views/standard_view.dart +++ b/lib/folder_views/standard_view.dart @@ -159,7 +159,7 @@ class StandardView extends StatelessWidget { } var dc = Theme.of(context).dividerColor; - var divider = Container( + var divider = SizedBox( height: 1.0, child: Divider(color: dc.withOpacity(dc.opacity / 3)), ); diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 8e721091..4485996d 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -248,6 +248,8 @@ abstract class LocaleKeys { 'settings.noteMetaData.customMetaData.invalid'; static const settings_noteMetaData_customMetaData = 'settings.noteMetaData.customMetaData'; + static const settings_noteMetaData_output = 'settings.noteMetaData.output'; + static const settings_noteMetaData_input = 'settings.noteMetaData.input'; static const settings_noteMetaData = 'settings.noteMetaData'; static const settings_privacy = 'settings.privacy'; static const settings_terms = 'settings.terms'; diff --git a/lib/iap/purchase_manager.dart b/lib/iap/purchase_manager.dart index 7e34a47e..ed3f4e83 100644 --- a/lib/iap/purchase_manager.dart +++ b/lib/iap/purchase_manager.dart @@ -23,7 +23,7 @@ typedef PurchaseCallback = void Function(String, SubscriptionStatus?); class PurchaseManager { late InAppPurchaseConnection con; late StreamSubscription> _subscription; - List _callbacks = []; + final List _callbacks = []; static String? error; static PurchaseManager? _instance; diff --git a/lib/iap/purchase_screen.dart b/lib/iap/purchase_screen.dart index 0958fb64..9c01b5f1 100644 --- a/lib/iap/purchase_screen.dart +++ b/lib/iap/purchase_screen.dart @@ -105,7 +105,7 @@ class _PurchaseScreenState extends State { padding: const EdgeInsets.fromLTRB(16.0, 0.0, 16.0, 16.0), child: Wrap( children: [ - RestorePurchaseButton(), + const RestorePurchaseButton(), OutlinedButton( child: Text( tr(LocaleKeys.feature_timeline_title), @@ -113,7 +113,7 @@ class _PurchaseScreenState extends State { ), onPressed: () { var route = MaterialPageRoute( - builder: (context) => FeatureTimelineScreen(), + builder: (context) => const FeatureTimelineScreen(), settings: const RouteSettings(name: '/featureTimeline'), ); Navigator.of(context).push(route); @@ -219,13 +219,13 @@ class YearlyPurchaseWidget extends StatelessWidget { class PurchaseCard extends StatelessWidget { final Widget child; - PurchaseCard({required this.child}); + const PurchaseCard({required this.child}); @override Widget build(BuildContext context) { var mediaQuery = MediaQuery.of(context); - return Container( + return SizedBox( width: mediaQuery.size.width * 0.80, child: Card( shape: RoundedRectangleBorder( @@ -243,7 +243,7 @@ class PurchaseCard extends StatelessWidget { class PurchaseCards extends StatelessWidget { final List children; - PurchaseCards({required this.children}); + const PurchaseCards({required this.children}); @override Widget build(BuildContext context) { diff --git a/lib/iap/purchase_slider.dart b/lib/iap/purchase_slider.dart index fce64e28..a6db2029 100644 --- a/lib/iap/purchase_slider.dart +++ b/lib/iap/purchase_slider.dart @@ -16,7 +16,8 @@ class PaymentInfo extends Equatable { final String text; final String id; - PaymentInfo({required this.id, required this.value, required this.text}); + const PaymentInfo( + {required this.id, required this.value, required this.text}); @override List get props => [value, text, id]; @@ -54,7 +55,7 @@ class PurchaseSlider extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return SizedBox( height: 50, child: CustomPaint( painter: ShapePainter( diff --git a/lib/iap/purchase_widget.dart b/lib/iap/purchase_widget.dart index 29abb9af..fd5c299b 100644 --- a/lib/iap/purchase_widget.dart +++ b/lib/iap/purchase_widget.dart @@ -28,13 +28,14 @@ class PurchaseButton extends StatelessWidget { final Func1 purchaseStarted; final PurchaseCallback purchaseCompleted; - PurchaseButton( + const PurchaseButton( this.product, this.timePeriod, { + Key? key, required this.subscription, required this.purchaseStarted, required this.purchaseCompleted, - }); + }) : super(key: key); @override Widget build(BuildContext context) { @@ -104,12 +105,13 @@ class PurchaseWidget extends StatefulWidget { final String timePeriod; final bool isSubscription; - PurchaseWidget({ + const PurchaseWidget({ + Key? key, required this.skus, required this.defaultSku, this.timePeriod = "", required this.isSubscription, - }); + }) : super(key: key); @override _PurchaseWidgetState createState() => _PurchaseWidgetState(); @@ -293,7 +295,7 @@ class _PurchaseSliderButton extends StatelessWidget { final Widget icon; final void Function() onPressed; - _PurchaseSliderButton({required this.icon, required this.onPressed}); + const _PurchaseSliderButton({required this.icon, required this.onPressed}); @override Widget build(BuildContext context) { @@ -309,7 +311,7 @@ class _PurchaseSliderButton extends StatelessWidget { class PurchaseFailedDialog extends StatelessWidget { final String text; - PurchaseFailedDialog(this.text); + const PurchaseFailedDialog(this.text, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -327,6 +329,8 @@ class PurchaseFailedDialog extends StatelessWidget { } class RestorePurchaseButton extends StatefulWidget { + const RestorePurchaseButton({Key? key}) : super(key: key); + @override _RestorePurchaseButtonState createState() => _RestorePurchaseButtonState(); } diff --git a/lib/logger/debug_screen.dart b/lib/logger/debug_screen.dart index a0ada102..79acfae6 100644 --- a/lib/logger/debug_screen.dart +++ b/lib/logger/debug_screen.dart @@ -19,12 +19,14 @@ import 'package:gitjournal/settings/app_settings.dart'; import 'package:gitjournal/utils/utils.dart'; class DebugScreen extends StatefulWidget { + const DebugScreen({Key? key}) : super(key: key); + @override _DebugScreenState createState() => _DebugScreenState(); } class _DebugScreenState extends State { - ScrollController _controller = ScrollController(); + final ScrollController _controller = ScrollController(); late List _logs; @@ -323,7 +325,12 @@ class FilterListTile extends StatelessWidget { final String internalLevel; final String currentLevel; - FilterListTile(this.publicLevel, this.internalLevel, this.currentLevel); + const FilterListTile( + this.publicLevel, + this.internalLevel, + this.currentLevel, { + Key? key, + }) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/logger/fakes/debug_screen_fake.dart b/lib/logger/fakes/debug_screen_fake.dart index e7809092..e4fbea3d 100644 --- a/lib/logger/fakes/debug_screen_fake.dart +++ b/lib/logger/fakes/debug_screen_fake.dart @@ -32,7 +32,7 @@ class _DebugScreenFakeState extends State { @override Widget build(BuildContext context) { - return DebugScreen(); + return const DebugScreen(); } } diff --git a/lib/logger/logger.dart b/lib/logger/logger.dart index 9a39d6bf..fabd1e8c 100644 --- a/lib/logger/logger.dart +++ b/lib/logger/logger.dart @@ -144,7 +144,7 @@ class Log { t: DateTime.now().millisecondsSinceEpoch, l: level, msg: msg.replaceAll('\n', ' '), - ex: ex != null ? ex.toString().replaceAll('\n', ' ') : null, + ex: ex?.toString().replaceAll('\n', ' '), props: props, ); if (stackTrace != null) { diff --git a/lib/markdown/markdown_latex.dart b/lib/markdown/markdown_latex.dart index 0ce9eb0e..da9ffc66 100644 --- a/lib/markdown/markdown_latex.dart +++ b/lib/markdown/markdown_latex.dart @@ -20,7 +20,7 @@ import 'package:markdown/markdown.dart' as md; // Alternatively, \begin{math} and \end{math} can be used. class MathJaxInlineSyntax extends md.InlineSyntax { - static final String _pattern = r'\\(.*\\)'; + static const String _pattern = r'\\(.*\\)'; MathJaxInlineSyntax() : super(_pattern); diff --git a/lib/repository.dart b/lib/repository.dart index 6c30ed31..cd872b93 100644 --- a/lib/repository.dart +++ b/lib/repository.dart @@ -196,7 +196,7 @@ class GitJournalRepo with ChangeNotifier { await _notesCache.buildCache(notesFolder); var changes = await _gitRepo.numChanges(); - numChanges = changes != null ? changes : 0; + numChanges = changes ?? 0; notifyListeners(); }); } diff --git a/lib/screens/feature_timeline_screen.dart b/lib/screens/feature_timeline_screen.dart index 6b194b27..c2ed999c 100644 --- a/lib/screens/feature_timeline_screen.dart +++ b/lib/screens/feature_timeline_screen.dart @@ -15,6 +15,8 @@ import 'package:gitjournal/features.dart'; import 'package:gitjournal/generated/locale_keys.g.dart'; class FeatureTimelineScreen extends StatelessWidget { + const FeatureTimelineScreen({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { var theme = Theme.of(context); @@ -50,7 +52,7 @@ class FeatureTimelineScreen extends StatelessWidget { class FeatureTile extends StatelessWidget { final Feature feature; - FeatureTile(this.feature); + const FeatureTile(this.feature, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -84,7 +86,7 @@ class _Tile extends StatelessWidget { final String iconText; final Color iconColor; - _Tile({ + const _Tile({ required this.title, required this.subTitle, required this.iconText, @@ -107,7 +109,7 @@ class _Tile extends StatelessWidget { ), child: Row( children: [ - Container( + SizedBox( width: 56.0, child: _Sign(iconText, iconColor), ), @@ -142,7 +144,7 @@ class _Sign extends StatelessWidget { final String text; final Color? color; - _Sign(this.text, this.color); + const _Sign(this.text, this.color); @override Widget build(BuildContext context) { diff --git a/lib/screens/folder_listing.dart b/lib/screens/folder_listing.dart index 169973ca..bf3024b8 100644 --- a/lib/screens/folder_listing.dart +++ b/lib/screens/folder_listing.dart @@ -7,6 +7,7 @@ import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; +import 'package:gitjournal/core/notes_folder.dart'; import 'package:provider/provider.dart'; import 'package:gitjournal/core/flattened_notes_folder.dart'; @@ -40,7 +41,7 @@ class _FolderListingScreenState extends State { key: _folderTreeViewKey, rootFolder: notesFolder, onFolderEntered: (NotesFolderFS folder) { - var destination; + late NotesFolder destination; if (settings.experimentalSubfolders) { destination = FlattenedNotesFolder(folder, title: folder.name); } else { @@ -245,7 +246,7 @@ class _CreateFolderAlertDialogState extends State { class FolderErrorDialog extends StatelessWidget { final String content; - FolderErrorDialog(this.content); + const FolderErrorDialog(this.content); @override Widget build(BuildContext context) { diff --git a/lib/screens/graph_view.dart b/lib/screens/graph_view.dart index 8c468f20..c04925ea 100644 --- a/lib/screens/graph_view.dart +++ b/lib/screens/graph_view.dart @@ -13,6 +13,8 @@ import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/core/views/note_links_view.dart'; class GraphViewScreen extends StatefulWidget { + const GraphViewScreen({Key? key}) : super(key: key); + @override _GraphViewScreenState createState() => _GraphViewScreenState(); } @@ -30,7 +32,7 @@ class _GraphViewScreenState extends State { graph = Graph.fromFolder(rootFolder, linksProvider); graph!.addListener(_setState); }); - return Container(width: 2500, height: 2500); + return const SizedBox(width: 2500, height: 2500); } return SafeArea(child: graph != null ? GraphView(graph!) : Container()); @@ -56,7 +58,7 @@ class _GraphViewScreenState extends State { class GraphView extends StatefulWidget { final Graph graph; - GraphView(this.graph); + const GraphView(this.graph); @override _GraphViewState createState() => _GraphViewState(); @@ -195,7 +197,7 @@ class NodeWidget extends StatelessWidget { final Node node; final double size; - NodeWidget(this.node, this.size); + const NodeWidget(this.node, this.size); @override Widget build(BuildContext context) { diff --git a/lib/screens/note_editor.dart b/lib/screens/note_editor.dart index b1c64e1c..4f45e953 100644 --- a/lib/screens/note_editor.dart +++ b/lib/screens/note_editor.dart @@ -66,7 +66,7 @@ class NoteEditor extends StatefulWidget { newNoteFileName = null, newNoteExtraProps = null; - NoteEditor.newNote( + const NoteEditor.newNote( this.notesFolder, this.parentFolderView, this.defaultEditorType, { diff --git a/lib/screens/onboarding_screens.dart b/lib/screens/onboarding_screens.dart index a72811cc..c84d50f2 100644 --- a/lib/screens/onboarding_screens.dart +++ b/lib/screens/onboarding_screens.dart @@ -18,7 +18,7 @@ import 'package:gitjournal/analytics/analytics.dart'; import 'package:gitjournal/settings/app_settings.dart'; class OnBoardingScreen extends StatefulWidget { - OnBoardingScreen(); + const OnBoardingScreen(); @override OnBoardingScreenState createState() { @@ -159,7 +159,7 @@ class OnBoardingBottomButton extends StatelessWidget { final Func0 onPressed; final String text; - OnBoardingBottomButton({ + const OnBoardingBottomButton({ Key? key, required this.text, required this.onPressed, @@ -202,21 +202,19 @@ class OnBoardingPage1 extends StatelessWidget { ], ); - return Container( - child: Column( - children: [ - Center(child: header), - const SizedBox(height: 64.0), - AutoSizeText( - tr("OnBoarding.subtitle"), - style: textTheme.headline5, - textAlign: TextAlign.center, - maxLines: 2, - ), - ], - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - ), + return Column( + children: [ + Center(child: header), + const SizedBox(height: 64.0), + AutoSizeText( + tr("OnBoarding.subtitle"), + style: textTheme.headline5, + textAlign: TextAlign.center, + maxLines: 2, + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, ); } } @@ -238,21 +236,19 @@ class OnBoardingPage2 extends StatelessWidget { ], ); - return Container( - child: Column( - children: [ - Center(child: header), - const SizedBox(height: 64.0), - AutoSizeText( - tr("OnBoarding.page2"), - style: textTheme.headline5, - textAlign: TextAlign.center, - maxLines: 3, - ), - ], - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - ), + return Column( + children: [ + Center(child: header), + const SizedBox(height: 64.0), + AutoSizeText( + tr("OnBoarding.page2"), + style: textTheme.headline5, + textAlign: TextAlign.center, + maxLines: 3, + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, ); } } @@ -274,21 +270,19 @@ class OnBoardingPage3 extends StatelessWidget { ], ); - return Container( - child: Column( - children: [ - Center(child: header), - const SizedBox(height: 64.0), - AutoSizeText( - tr("OnBoarding.page3"), - style: textTheme.headline5, - textAlign: TextAlign.center, - maxLines: 2, - ), - ], - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - ), + return Column( + children: [ + Center(child: header), + const SizedBox(height: 64.0), + AutoSizeText( + tr("OnBoarding.page3"), + style: textTheme.headline5, + textAlign: TextAlign.center, + maxLines: 2, + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, ); } } diff --git a/lib/screens/onboarding_screens_stories.dart b/lib/screens/onboarding_screens_stories.dart index 81e2fe10..efa9a1bb 100644 --- a/lib/screens/onboarding_screens_stories.dart +++ b/lib/screens/onboarding_screens_stories.dart @@ -29,4 +29,4 @@ Widget page3() { ); } -Widget all() => OnBoardingScreen(); +Widget all() => const OnBoardingScreen(); diff --git a/lib/screens/tag_listing.dart b/lib/screens/tag_listing.dart index 961b7a27..38560559 100644 --- a/lib/screens/tag_listing.dart +++ b/lib/screens/tag_listing.dart @@ -27,6 +27,8 @@ import 'package:gitjournal/widgets/future_builder_with_progress.dart'; import 'package:gitjournal/widgets/pro_overlay.dart'; class TagListingScreen extends StatelessWidget { + const TagListingScreen({Key? key}) : super(key: key); + @override Widget build(BuildContext context) { var rootFolder = Provider.of(context); diff --git a/lib/settings/settings_bottom_menu_bar.dart b/lib/settings/settings_bottom_menu_bar.dart index 02d6b9f6..15d9ca7f 100644 --- a/lib/settings/settings_bottom_menu_bar.dart +++ b/lib/settings/settings_bottom_menu_bar.dart @@ -71,7 +71,7 @@ class _BottomMenuBarSettingsState extends State { child: Container( padding: const EdgeInsets.all(2.0), color: theme.colorScheme.secondary.withAlpha(256 ~/ 10), - child: Container( + child: SizedBox( width: mq.size.width, height: mq.size.height, child: IgnorePointer(child: HomeScreen()), diff --git a/lib/settings/settings_display_images.dart b/lib/settings/settings_display_images.dart index b07a45e3..ae1c3f91 100644 --- a/lib/settings/settings_display_images.dart +++ b/lib/settings/settings_display_images.dart @@ -73,19 +73,20 @@ class SettingsDisplayImagesScreenState activeColor: theme.colorScheme.secondary, inactiveColor: theme.disabledColor, )), - Container( - width: 40, - child: settings.maxImageZoom == double.infinity - ? Icon( - Icons.all_inclusive, - color: theme.colorScheme.secondary, - ) - : Text( - NumberFormat("##.0").format(settings.maxImageZoom), - style: theme.textTheme.subtitle2! - .copyWith(color: theme.colorScheme.secondary), - textAlign: TextAlign.center, - )) + SizedBox( + width: 40, + child: settings.maxImageZoom == double.infinity + ? Icon( + Icons.all_inclusive, + color: theme.colorScheme.secondary, + ) + : Text( + NumberFormat("##.0").format(settings.maxImageZoom), + style: theme.textTheme.subtitle2! + .copyWith(color: theme.colorScheme.secondary), + textAlign: TextAlign.center, + ), + ) ])), SwitchListTile( title: Text( diff --git a/lib/settings/settings_display_images_caption.dart b/lib/settings/settings_display_images_caption.dart index 54d8dbf5..b208e78c 100644 --- a/lib/settings/settings_display_images_caption.dart +++ b/lib/settings/settings_display_images_caption.dart @@ -29,13 +29,14 @@ class SettingsDisplayImagesCaptionScreenState @override Widget build(BuildContext context) { var settings = Provider.of(context); - var saveDoNotCaptionTag = (String? doNotCaptionTags) { + void saveDoNotCaptionTag(String? doNotCaptionTags) { if (doNotCaptionTags == null) { return; } settings.doNotCaptionTags = parseTags(doNotCaptionTags); settings.save(); - }; + } + var doNotCaptionTagsForm = Form( child: TextFormField( key: doNotCaptionTagsKey, diff --git a/lib/settings/settings_display_images_theming.dart b/lib/settings/settings_display_images_theming.dart index eb5cc493..3ab2749a 100644 --- a/lib/settings/settings_display_images_theming.dart +++ b/lib/settings/settings_display_images_theming.dart @@ -31,10 +31,11 @@ class SettingsDisplayImagesThemingScreenState Widget build(BuildContext context) { var settings = Provider.of(context); - var saveDoNotThemeTag = (String? doNotThemeTags) { + void saveDoNotThemeTag(String? doNotThemeTags) { settings.doNotThemeTags = parseTags(doNotThemeTags!); settings.save(); - }; + } + var doNotThemeTagsForm = Form( child: TextFormField( key: doNotThemeTagsKey, @@ -70,10 +71,11 @@ class SettingsDisplayImagesThemingScreenState }, ); - var saveDoThemeTag = (String? doThemeTags) { + void saveDoThemeTag(String? doThemeTags) { settings.doThemeTags = parseTags(doThemeTags!); settings.save(); - }; + } + var doThemeTagsForm = Form( child: TextFormField( key: doThemeTagsKey, diff --git a/lib/settings/settings_experimental.dart b/lib/settings/settings_experimental.dart index 686b492d..dfb73bcd 100644 --- a/lib/settings/settings_experimental.dart +++ b/lib/settings/settings_experimental.dart @@ -141,16 +141,16 @@ class _PasswordForm extends StatelessWidget { onChanged: (String value) { value = value.trim(); if (value.isEmpty) { - return null; + return; } - final salt = 'randomSaltGitJournal'; + const salt = 'randomSaltGitJournal'; var sha1Digest = sha1.convert(utf8.encode(value + salt)); print(sha1Digest); if (sha1Digest.toString() != '27538d8231e49655fd1c26c7b8495c2c870c741b') { - return null; + return; } print('Unlocking Pro Mode'); diff --git a/lib/settings/settings_git_remote.dart b/lib/settings/settings_git_remote.dart index 9e78817c..eb3466f0 100644 --- a/lib/settings/settings_git_remote.dart +++ b/lib/settings/settings_git_remote.dart @@ -254,7 +254,7 @@ class Button extends StatelessWidget { final String text; final void Function() onPressed; - Button({required this.text, required this.onPressed}); + const Button({required this.text, required this.onPressed}); @override Widget build(BuildContext context) { @@ -280,7 +280,7 @@ class RedButton extends StatelessWidget { final String text; final void Function() onPressed; - RedButton({required this.text, required this.onPressed}); + const RedButton({required this.text, required this.onPressed}); @override Widget build(BuildContext context) { @@ -304,7 +304,7 @@ class RedButton extends StatelessWidget { class IrreversibleActionConfirmationDialog extends StatelessWidget { final String title; - IrreversibleActionConfirmationDialog(this.title); + const IrreversibleActionConfirmationDialog(this.title); @override Widget build(BuildContext context) { diff --git a/lib/settings/settings_git_widgets.dart b/lib/settings/settings_git_widgets.dart index d6e77ece..a4f1709d 100644 --- a/lib/settings/settings_git_widgets.dart +++ b/lib/settings/settings_git_widgets.dart @@ -22,12 +22,12 @@ class GitAuthorEmail extends StatelessWidget { Widget build(BuildContext context) { var gitConfig = Provider.of(context); - var saveGitAuthorEmail = (String? gitAuthorEmail) { + void saveGitAuthorEmail(String? gitAuthorEmail) { if (gitAuthorEmail == null) return; gitConfig.gitAuthorEmail = gitAuthorEmail; gitConfig.save(); - }; + } return Form( child: TextFormField( @@ -73,11 +73,11 @@ class GitAuthor extends StatelessWidget { Widget build(BuildContext context) { var gitConfig = Provider.of(context); - var saveGitAuthor = (String? gitAuthor) { + void saveGitAuthor(String? gitAuthor) { if (gitAuthor == null) return; gitConfig.gitAuthor = gitAuthor; gitConfig.save(); - }; + } return Form( child: TextFormField( diff --git a/lib/settings/settings_note_metadata.dart b/lib/settings/settings_note_metadata.dart index 1850dd9a..f7910cc5 100644 --- a/lib/settings/settings_note_metadata.dart +++ b/lib/settings/settings_note_metadata.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:function_types/function_types.dart'; +import 'package:gitjournal/generated/locale_keys.g.dart'; import 'package:provider/provider.dart'; import 'package:time/time.dart'; @@ -105,7 +106,7 @@ class _NoteMetadataSettingsScreenState ), ListPreference( title: tr("settings.noteMetaData.modified"), - options: [ + options: const [ "modified", "mod", "lastmodified", @@ -123,7 +124,7 @@ class _NoteMetadataSettingsScreenState ), ListPreference( title: tr("settings.noteMetaData.created"), - options: [ + options: const [ "created", "date", ], @@ -138,7 +139,7 @@ class _NoteMetadataSettingsScreenState ), ListPreference( title: tr("settings.noteMetaData.tags"), - options: [ + options: const [ "tags", "categories", "keywords", @@ -197,7 +198,7 @@ class _NoteMetadataSettingsScreenState class NoteOutputExample extends StatelessWidget { final Note note; - NoteOutputExample(this.note); + const NoteOutputExample(this.note); @override Widget build(BuildContext context) { @@ -222,7 +223,10 @@ class NoteOutputExample extends StatelessWidget { child: Text(noteStr, style: style), ), _HeaderText(note.fileName, Alignment.topRight), - _HeaderText("Output", Alignment.topLeft), + _HeaderText( + LocaleKeys.settings_noteMetaData_output.tr(), + Alignment.topLeft, + ), ], ), ); @@ -232,7 +236,7 @@ class NoteOutputExample extends StatelessWidget { class NoteInputExample extends StatelessWidget { final Note note; - NoteInputExample(this.note); + const NoteInputExample(this.note); @override Widget build(BuildContext context) { @@ -263,7 +267,10 @@ class NoteInputExample extends StatelessWidget { ), ), _HeaderText(note.fileName, Alignment.topRight), - _HeaderText("Input", Alignment.topLeft), + _HeaderText( + LocaleKeys.settings_noteMetaData_input.tr(), + Alignment.topLeft, + ), ], ), ), @@ -275,7 +282,7 @@ class _HeaderText extends StatelessWidget { final String text; final Alignment alignment; - _HeaderText(this.text, this.alignment); + const _HeaderText(this.text, this.alignment); @override Widget build(BuildContext context) { @@ -296,7 +303,7 @@ class _HeaderText extends StatelessWidget { class _Tag extends StatelessWidget { final String text; - _Tag(this.text); + const _Tag(this.text); @override Widget build(BuildContext context) { @@ -306,8 +313,8 @@ class _Tag extends StatelessWidget { decoration: BoxDecoration( borderRadius: BorderRadius.circular(50), color: theme.scaffoldBackgroundColor, - boxShadow: [ - const BoxShadow(color: Colors.grey, spreadRadius: 1), + boxShadow: const [ + BoxShadow(color: Colors.grey, spreadRadius: 1), ], ), padding: const EdgeInsets.all(8.0), @@ -319,7 +326,7 @@ class _Tag extends StatelessWidget { class TagsWidget extends StatelessWidget { final Set tags; - TagsWidget(this.tags); + const TagsWidget(this.tags); @override Widget build(BuildContext context) { @@ -338,7 +345,7 @@ class CustomMetDataTile extends StatefulWidget { final String value; final Func1 onChange; - CustomMetDataTile({required this.value, required this.onChange}); + const CustomMetDataTile({required this.value, required this.onChange}); @override _CustomMetDataTileState createState() => _CustomMetDataTileState(); diff --git a/lib/settings/settings_screen.dart b/lib/settings/settings_screen.dart index 620ee023..f8a27206 100644 --- a/lib/settings/settings_screen.dart +++ b/lib/settings/settings_screen.dart @@ -229,7 +229,7 @@ class SettingsListState extends State { subtitle: Text(tr(LocaleKeys.settings_tags_subtitle)), onTap: () { var route = MaterialPageRoute( - builder: (context) => SettingsTagsScreen(), + builder: (context) => const SettingsTagsScreen(), settings: const RouteSettings(name: '/settings/tags'), ); Navigator.of(context).push(route); @@ -359,7 +359,7 @@ class SettingsListState extends State { title: Text(tr(LocaleKeys.feature_timeline_title)), onTap: () { var route = MaterialPageRoute( - builder: (context) => FeatureTimelineScreen(), + builder: (context) => const FeatureTimelineScreen(), settings: const RouteSettings(name: '/featureTimeline'), ); Navigator.of(context).push(route); @@ -389,13 +389,13 @@ class SettingsListState extends State { ); }, ), - VersionNumberTile(), + const VersionNumberTile(), ListTile( title: Text(tr(LocaleKeys.settings_debug_title)), subtitle: Text(tr(LocaleKeys.settings_debug_subtitle)), onTap: () { var route = MaterialPageRoute( - builder: (context) => DebugScreen(), + builder: (context) => const DebugScreen(), settings: const RouteSettings(name: '/settings/debug'), ); Navigator.of(context).push(route); @@ -430,7 +430,7 @@ class SettingsListState extends State { class SettingsHeader extends StatelessWidget { final String text; - SettingsHeader(this.text); + const SettingsHeader(this.text); @override Widget build(BuildContext context) { @@ -448,6 +448,8 @@ class SettingsHeader extends StatelessWidget { } class VersionNumberTile extends StatefulWidget { + const VersionNumberTile({Key? key}) : super(key: key); + @override VersionNumberTileState createState() { return VersionNumberTileState(); diff --git a/lib/settings/settings_tags.dart b/lib/settings/settings_tags.dart index 69b13060..04f853d9 100644 --- a/lib/settings/settings_tags.dart +++ b/lib/settings/settings_tags.dart @@ -13,6 +13,8 @@ import 'package:gitjournal/core/notes_folder_config.dart'; import 'package:gitjournal/settings/settings_screen.dart'; class SettingsTagsScreen extends StatefulWidget { + const SettingsTagsScreen({Key? key}) : super(key: key); + @override SettingsTagsScreenState createState() => SettingsTagsScreenState(); } diff --git a/lib/settings/settings_widgets.dart b/lib/settings/settings_widgets.dart index 34444298..bd6bb971 100644 --- a/lib/settings/settings_widgets.dart +++ b/lib/settings/settings_widgets.dart @@ -17,13 +17,14 @@ class ListPreference extends StatelessWidget { final Function onChange; final bool enabled; - ListPreference({ + const ListPreference({ required this.title, required this.currentOption, required this.options, required this.onChange, this.enabled = true, - }); + Key? key, + }) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/setup/autoconfigure.dart b/lib/setup/autoconfigure.dart index b1ab5e36..7c54af5a 100644 --- a/lib/setup/autoconfigure.dart +++ b/lib/setup/autoconfigure.dart @@ -25,10 +25,11 @@ class GitHostSetupAutoConfigurePage extends StatefulWidget { final GitHostType gitHostType; final Func2 onDone; - GitHostSetupAutoConfigurePage({ + const GitHostSetupAutoConfigurePage({ required this.gitHostType, required this.onDone, - }); + Key? key, + }) : super(key: key); @override GitHostSetupAutoConfigurePageState createState() { diff --git a/lib/setup/button.dart b/lib/setup/button.dart index f12f5f0e..9817ea61 100644 --- a/lib/setup/button.dart +++ b/lib/setup/button.dart @@ -16,11 +16,12 @@ class GitHostSetupButton extends StatelessWidget { final String text; final String? iconUrl; - GitHostSetupButton({ + const GitHostSetupButton({ required this.text, required this.onPressed, this.iconUrl, - }); + Key? key, + }) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/setup/clone_auto_select.dart b/lib/setup/clone_auto_select.dart index d651b46d..5f340f29 100644 --- a/lib/setup/clone_auto_select.dart +++ b/lib/setup/clone_auto_select.dart @@ -6,7 +6,7 @@ import 'package:universal_io/io.dart' show Platform; -import 'clone_gitExec.dart' as git_exec; +import 'clone_git_exec.dart' as git_exec; import 'clone_libgit2.dart' as libgit2; final isMobileApp = Platform.isIOS || Platform.isAndroid; diff --git a/lib/setup/clone_gitExec.dart b/lib/setup/clone_git_exec.dart similarity index 100% rename from lib/setup/clone_gitExec.dart rename to lib/setup/clone_git_exec.dart diff --git a/lib/setup/clone_url.dart b/lib/setup/clone_url.dart index cd9a78b8..ede8eb95 100644 --- a/lib/setup/clone_url.dart +++ b/lib/setup/clone_url.dart @@ -19,10 +19,11 @@ class GitCloneUrlPage extends StatefulWidget { final Func1 doneFunction; final String initialValue; - GitCloneUrlPage({ + const GitCloneUrlPage({ required this.doneFunction, required this.initialValue, - }); + Key? key, + }) : super(key: key); @override GitCloneUrlPageState createState() { @@ -39,7 +40,7 @@ class GitCloneUrlPageState extends State { @override Widget build(BuildContext context) { - final formSubmitted = () { + void formSubmitted() { if (_formKey.currentState!.validate()) { _formKey.currentState!.save(); @@ -47,7 +48,7 @@ class GitCloneUrlPageState extends State { widget.doneFunction(url.trim()); inputFormFocus.unfocus(); } - }; + } var inputForm = Form( key: _formKey, @@ -100,12 +101,13 @@ class GitCloneUrlKnownProviderPage extends StatefulWidget { final GitHostType gitHostType; final String initialValue; - GitCloneUrlKnownProviderPage({ + const GitCloneUrlKnownProviderPage({ required this.doneFunction, required this.launchCreateUrlPage, required this.gitHostType, required this.initialValue, - }); + Key? key, + }) : super(key: key); @override GitCloneUrlKnownProviderPageState createState() { diff --git a/lib/setup/cloning.dart b/lib/setup/cloning.dart index afb6f36c..a12932cc 100644 --- a/lib/setup/cloning.dart +++ b/lib/setup/cloning.dart @@ -22,7 +22,9 @@ class GitHostCloningPage extends StatelessWidget { GitHostCloningPage({ required this.errorMessage, required this.cloneProgress, - }) : loadingMessage = tr(LocaleKeys.setup_cloning); + Key? key, + }) : loadingMessage = tr(LocaleKeys.setup_cloning), + super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/setup/error.dart b/lib/setup/error.dart index c2f9937c..cc6a28ce 100644 --- a/lib/setup/error.dart +++ b/lib/setup/error.dart @@ -11,7 +11,7 @@ import 'package:easy_localization/easy_localization.dart'; class GitHostSetupErrorPage extends StatelessWidget { final String errorMessage; - GitHostSetupErrorPage(this.errorMessage); + const GitHostSetupErrorPage(this.errorMessage); @override Widget build(BuildContext context) { diff --git a/lib/setup/key_editors.dart b/lib/setup/key_editors.dart index f7a62ce8..42d152d0 100644 --- a/lib/setup/key_editors.dart +++ b/lib/setup/key_editors.dart @@ -16,7 +16,7 @@ class PublicKeyEditor extends StatelessWidget { final Key formKey; final TextEditingController _controller; - PublicKeyEditor(this.formKey, this._controller); + const PublicKeyEditor(this.formKey, this._controller); @override Widget build(BuildContext context) { @@ -40,7 +40,7 @@ class PrivateKeyEditor extends StatelessWidget { final Key formKey; final TextEditingController _controller; - PrivateKeyEditor(this.formKey, this._controller); + const PrivateKeyEditor(this.formKey, this._controller); @override Widget build(BuildContext context) { @@ -69,7 +69,7 @@ class KeyEditor extends StatelessWidget { final TextEditingController textEditingController; final String? Function(String?) validator; - KeyEditor(this.formKey, this.textEditingController, this.validator); + const KeyEditor(this.formKey, this.textEditingController, this.validator); @override Widget build(BuildContext context) { diff --git a/lib/setup/loading.dart b/lib/setup/loading.dart index ae76d20f..7825c8d6 100644 --- a/lib/setup/loading.dart +++ b/lib/setup/loading.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; class GitHostSetupLoadingPage extends StatelessWidget { final String text; - GitHostSetupLoadingPage(this.text); + const GitHostSetupLoadingPage(this.text, {Key? key}) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/setup/loading_error.dart b/lib/setup/loading_error.dart index 6ed3e63f..1ad65495 100644 --- a/lib/setup/loading_error.dart +++ b/lib/setup/loading_error.dart @@ -13,7 +13,7 @@ class GitHostSetupLoadingErrorPage extends StatelessWidget { final String? errorMessage; final String loadingMessage; - GitHostSetupLoadingErrorPage({ + const GitHostSetupLoadingErrorPage({ required this.errorMessage, required this.loadingMessage, }); diff --git a/lib/setup/repo_selector.dart b/lib/setup/repo_selector.dart index 3a22be07..6cbc10f3 100644 --- a/lib/setup/repo_selector.dart +++ b/lib/setup/repo_selector.dart @@ -30,11 +30,12 @@ class GitHostSetupRepoSelector extends StatefulWidget { final UserInfo userInfo; final Func1 onDone; - GitHostSetupRepoSelector({ + const GitHostSetupRepoSelector({ + Key? key, required this.gitHost, required this.userInfo, required this.onDone, - }); + }) : super(key: key); @override GitHostSetupRepoSelectorState createState() { @@ -286,7 +287,7 @@ class _RepoTile extends StatelessWidget { final void Function() onTap; final bool selected; - _RepoTile({ + const _RepoTile({ required this.repo, required this.searchText, required this.onTap, @@ -400,7 +401,7 @@ class _SmartDateTime extends StatelessWidget { final DateTime? dt; final TextStyle? style; - _SmartDateTime(this.dt, this.style); + const _SmartDateTime(this.dt, this.style); static final _dateFormat = DateFormat('d MMM yyyy'); static final _dateFormatWithoutYear = DateFormat('d MMM'); diff --git a/lib/setup/screens.dart b/lib/setup/screens.dart index b2226b46..1773fa66 100644 --- a/lib/setup/screens.dart +++ b/lib/setup/screens.dart @@ -43,7 +43,7 @@ class GitHostSetupScreen extends StatefulWidget { final String remoteName; final Func2> onCompletedFunction; - GitHostSetupScreen({ + const GitHostSetupScreen({ required this.repoFolderName, required this.remoteName, required this.onCompletedFunction, @@ -62,7 +62,7 @@ enum KeyGenerationChoice { Unknown, AutoGenerated, UserProvided } class GitHostSetupScreenState extends State { var _pageCount = 1; - var _pageChoice = [ + final _pageChoice = [ PageChoice0.Unknown, PageChoice1.Unknown, ]; @@ -693,47 +693,45 @@ class GitHostChoicePage extends StatelessWidget { final Func1 onKnownGitHost; final Func0 onCustomGitHost; - GitHostChoicePage({ + const GitHostChoicePage({ required this.onKnownGitHost, required this.onCustomGitHost, }); @override Widget build(BuildContext context) { - return Container( - child: Column( - children: [ - Text( - tr(LocaleKeys.setup_host_title), - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 16.0), - GitHostSetupButton( - text: "GitHub", - iconUrl: 'assets/icon/github-icon.png', - onPressed: () { - onKnownGitHost(GitHostType.GitHub); - }, - ), - const SizedBox(height: 8.0), - GitHostSetupButton( - text: "GitLab", - iconUrl: 'assets/icon/gitlab-icon.png', - onPressed: () async { - onKnownGitHost(GitHostType.GitLab); - }, - ), - const SizedBox(height: 8.0), - GitHostSetupButton( - text: tr(LocaleKeys.setup_host_custom), - onPressed: () async { - onCustomGitHost(); - }, - ), - ], - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - ), + return Column( + children: [ + Text( + tr(LocaleKeys.setup_host_title), + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 16.0), + GitHostSetupButton( + text: "GitHub", + iconUrl: 'assets/icon/github-icon.png', + onPressed: () { + onKnownGitHost(GitHostType.GitHub); + }, + ), + const SizedBox(height: 8.0), + GitHostSetupButton( + text: "GitLab", + iconUrl: 'assets/icon/gitlab-icon.png', + onPressed: () async { + onKnownGitHost(GitHostType.GitLab); + }, + ), + const SizedBox(height: 8.0), + GitHostSetupButton( + text: tr(LocaleKeys.setup_host_custom), + onPressed: () async { + onCustomGitHost(); + }, + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, ); } } @@ -748,36 +746,34 @@ var _isDesktop = Platform.isLinux || Platform.isMacOS || Platform.isWindows; class GitHostAutoConfigureChoicePage extends StatelessWidget { final Func1 onDone; - GitHostAutoConfigureChoicePage({required this.onDone}); + const GitHostAutoConfigureChoicePage({required this.onDone}); @override Widget build(BuildContext context) { - return Container( - child: Column( - children: [ - Text( - tr(LocaleKeys.setup_autoConfigure_title), - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 16.0), - if (!_isDesktop) - GitHostSetupButton( - text: tr(LocaleKeys.setup_autoConfigure_automatic), - onPressed: () { - onDone(GitHostSetupType.Auto); - }, - ), - if (!_isDesktop) const SizedBox(height: 8.0), + return Column( + children: [ + Text( + tr(LocaleKeys.setup_autoConfigure_title), + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 16.0), + if (!_isDesktop) GitHostSetupButton( - text: tr(LocaleKeys.setup_autoConfigure_manual), - onPressed: () async { - onDone(GitHostSetupType.Manual); + text: tr(LocaleKeys.setup_autoConfigure_automatic), + onPressed: () { + onDone(GitHostSetupType.Auto); }, ), - ], - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - ), + if (!_isDesktop) const SizedBox(height: 8.0), + GitHostSetupButton( + text: tr(LocaleKeys.setup_autoConfigure_manual), + onPressed: () async { + onDone(GitHostSetupType.Manual); + }, + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, ); } } diff --git a/lib/setup/screens_stories.dart b/lib/setup/screens_stories.dart index da4c32d3..16fd87d2 100644 --- a/lib/setup/screens_stories.dart +++ b/lib/setup/screens_stories.dart @@ -41,7 +41,7 @@ Widget autoConfigure() { padding: const EdgeInsets.all(16.0), child: GitHostSetupAutoConfigurePage( gitHostType: GitHostType.GitHub, - onDone: (host, userInfo) => null, + onDone: (host, userInfo) {}, ), ); } @@ -51,15 +51,15 @@ Widget cloneUrl() { padding: const EdgeInsets.all(16.0), child: GitCloneUrlPage( initialValue: "foo?", - doneFunction: (val) => null, + doneFunction: (val) {}, ), ); } // FIXME: Create widgets for all the errors! Widget loadingError() { - return Padding( - padding: const EdgeInsets.all(16.0), + return const Padding( + padding: EdgeInsets.all(16.0), child: GitHostSetupErrorPage( "This is an error message", ), @@ -68,8 +68,8 @@ Widget loadingError() { // FIXME: Create widgets for all the loading screen messages! Widget loading() { - return Padding( - padding: const EdgeInsets.all(16.0), + return const Padding( + padding: EdgeInsets.all(16.0), child: GitHostSetupLoadingPage( "Loading Message", ), diff --git a/lib/setup/sshkey.dart b/lib/setup/sshkey.dart index 78db809e..c773e43b 100644 --- a/lib/setup/sshkey.dart +++ b/lib/setup/sshkey.dart @@ -22,7 +22,7 @@ class GitHostSetupSshKeyKnownProviderPage extends StatelessWidget { final Func0 openDeployKeyPage; - GitHostSetupSshKeyKnownProviderPage({ + const GitHostSetupSshKeyKnownProviderPage({ required this.doneFunction, required this.regenerateFunction, required this.copyKeyFunction, @@ -104,7 +104,7 @@ class GitHostSetupSshKeyUnknownProviderPage extends StatelessWidget { final Func1 copyKeyFunction; final String? publicKey; - GitHostSetupSshKeyUnknownProviderPage({ + const GitHostSetupSshKeyUnknownProviderPage({ required this.doneFunction, required this.regenerateFunction, required this.copyKeyFunction, @@ -178,34 +178,32 @@ class GitHostSetupKeyChoicePage extends StatelessWidget { final Func0 onGenerateKeys; final Func0 onUserProvidedKeys; - GitHostSetupKeyChoicePage({ + const GitHostSetupKeyChoicePage({ required this.onGenerateKeys, required this.onUserProvidedKeys, }); @override Widget build(BuildContext context) { - return Container( - child: Column( - children: [ - Text( - tr("setup.sshKeyChoice.title"), - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 16.0), - GitHostSetupButton( - text: tr("setup.sshKeyChoice.generate"), - onPressed: onGenerateKeys, - ), - const SizedBox(height: 8.0), - GitHostSetupButton( - text: tr("setup.sshKeyChoice.custom"), - onPressed: onUserProvidedKeys, - ), - ], - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - ), + return Column( + children: [ + Text( + tr("setup.sshKeyChoice.title"), + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 16.0), + GitHostSetupButton( + text: tr("setup.sshKeyChoice.generate"), + onPressed: onGenerateKeys, + ), + const SizedBox(height: 8.0), + GitHostSetupButton( + text: tr("setup.sshKeyChoice.custom"), + onPressed: onUserProvidedKeys, + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, ); } } @@ -215,7 +213,7 @@ class GitHostUserProvidedKeysPage extends StatefulWidget { doneFunction; // public, private, password final String saveText; - GitHostUserProvidedKeysPage({ + const GitHostUserProvidedKeysPage({ required this.doneFunction, this.saveText = "", }); @@ -259,68 +257,65 @@ class _GitHostUserProvidedKeysPageState @override Widget build(BuildContext context) { - var body = Container( - child: Column( - children: [ - Text( - tr(LocaleKeys.setup_sshKeyUserProvided_public), - style: Theme.of(context).textTheme.headline5, + var body = Column( + children: [ + Text( + tr(LocaleKeys.setup_sshKeyUserProvided_public), + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 8.0), + PublicKeyEditor(_publicFormKey, _publicKeyController), + const SizedBox(height: 8.0), + Text( + tr(LocaleKeys.setup_sshKeyUserProvided_private), + style: Theme.of(context).textTheme.headline5, + ), + const SizedBox(height: 8.0), + PrivateKeyEditor(_privateFormKey, _privateKeyController), + const SizedBox(height: 8.0), + TextField( + controller: _passwordController, + maxLines: 1, + decoration: InputDecoration( + helperText: tr(LocaleKeys.setup_sshKeyUserProvided_password), + border: const OutlineInputBorder(), + isDense: true, ), - const SizedBox(height: 8.0), - PublicKeyEditor(_publicFormKey, _publicKeyController), - const SizedBox(height: 8.0), - Text( - tr(LocaleKeys.setup_sshKeyUserProvided_private), - style: Theme.of(context).textTheme.headline5, - ), - const SizedBox(height: 8.0), - PrivateKeyEditor(_privateFormKey, _privateKeyController), - const SizedBox(height: 8.0), - TextField( - controller: _passwordController, - maxLines: 1, - decoration: InputDecoration( - helperText: tr(LocaleKeys.setup_sshKeyUserProvided_password), - border: const OutlineInputBorder(), - isDense: true, - ), - ), - const SizedBox(height: 16.0), - GitHostSetupButton( - text: saveText, - onPressed: () { - if (!mounted) return; + ), + const SizedBox(height: 16.0), + GitHostSetupButton( + text: saveText, + onPressed: () { + if (!mounted) return; - var publicValid = - _publicFormKey.currentState?.validate() ?? false; - var privateValid = - _privateFormKey.currentState?.validate() ?? false; + var publicValid = _publicFormKey.currentState?.validate() ?? false; + var privateValid = + _privateFormKey.currentState?.validate() ?? false; - if (!publicValid || !privateValid) { - return; - } + if (!publicValid || !privateValid) { + return; + } - var publicKey = _publicKeyController.text.trim(); - if (!publicKey.endsWith('\n')) { - publicKey += '\n'; - } + var publicKey = _publicKeyController.text.trim(); + if (!publicKey.endsWith('\n')) { + publicKey += '\n'; + } - var privateKey = _privateKeyController.text.trim(); - if (!privateKey.endsWith('\n')) { - privateKey += '\n'; - } + var privateKey = _privateKeyController.text.trim(); + if (!privateKey.endsWith('\n')) { + privateKey += '\n'; + } - widget.doneFunction( - publicKey, - privateKey, - _passwordController.text, - ); - }, - ), - ], - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.start, - ), + widget.doneFunction( + publicKey, + privateKey, + _passwordController.text, + ); + }, + ), + ], + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.start, ); return SingleChildScrollView( @@ -335,7 +330,7 @@ class _GitHostUserProvidedKeysPageState class PublicKeyWidget extends StatelessWidget { final String publicKey; - PublicKeyWidget(this.publicKey); + const PublicKeyWidget(this.publicKey); @override Widget build(BuildContext context) { return Container( diff --git a/lib/ssh/keygen.dart b/lib/ssh/keygen.dart index ec4552f9..ca2c6cd4 100644 --- a/lib/ssh/keygen.dart +++ b/lib/ssh/keygen.dart @@ -26,7 +26,7 @@ class SshKey { }); } -final bool useDartKeyGen = false; +const bool useDartKeyGen = false; Future generateSSHKeys({required String comment}) async { if (Platform.isAndroid || Platform.isIOS) { diff --git a/lib/utils/merge_conflict_resolver.dart b/lib/utils/merge_conflict_resolver.dart index bfd74dab..eb0df631 100644 --- a/lib/utils/merge_conflict_resolver.dart +++ b/lib/utils/merge_conflict_resolver.dart @@ -14,29 +14,29 @@ String resolveMergeConflict(String fileContents) { var seenStartMarker = false; var seenMiddleMarker = false; - lines.forEach((line) { + for (var line in lines) { if (line.startsWith("<<<<<<<") && !inMergeConflict) { inMergeConflict = true; seenStartMarker = true; - return; + continue; } if (line == "=======" && inMergeConflict && seenStartMarker) { seenMiddleMarker = true; - return; + continue; } if (line.startsWith(">>>>>>>") && inMergeConflict && seenMiddleMarker) { inMergeConflict = false; seenStartMarker = false; seenMiddleMarker = false; - return; + continue; } if (inMergeConflict && seenMiddleMarker) { - return; + continue; } newLines.add(line); - }); + } return newLines.join('\n'); } diff --git a/lib/widgets/app_drawer.dart b/lib/widgets/app_drawer.dart index 6c12904a..103a515f 100644 --- a/lib/widgets/app_drawer.dart +++ b/lib/widgets/app_drawer.dart @@ -65,7 +65,7 @@ class _AppDrawerState extends State } Widget _buildRepoList() { - var divider = Row(children: [const Expanded(child: Divider())]); + var divider = Row(children: const [Expanded(child: Divider())]); var repoManager = context.watch(); var repoIds = repoManager.repoIds; @@ -127,7 +127,7 @@ class _AppDrawerState extends State ); } - var divider = Row(children: [const Expanded(child: Divider())]); + var divider = Row(children: const [Expanded(child: Divider())]); var user = Supabase.instance.client.auth.currentUser; return Drawer( diff --git a/lib/widgets/app_drawer_header.dart b/lib/widgets/app_drawer_header.dart index 0e49ce9b..e4eb3052 100644 --- a/lib/widgets/app_drawer_header.dart +++ b/lib/widgets/app_drawer_header.dart @@ -23,7 +23,7 @@ import 'package:gitjournal/settings/settings.dart'; class AppDrawerHeader extends StatelessWidget { final Func0 repoListToggled; - AppDrawerHeader({ + const AppDrawerHeader({ required this.repoListToggled, }); diff --git a/lib/widgets/folder_selection_dialog.dart b/lib/widgets/folder_selection_dialog.dart index 21fc862e..aed04497 100644 --- a/lib/widgets/folder_selection_dialog.dart +++ b/lib/widgets/folder_selection_dialog.dart @@ -19,7 +19,7 @@ class FolderSelectionDialog extends StatelessWidget { Widget build(BuildContext context) { final notesFolder = Provider.of(context); - var body = Container( + var body = SizedBox( width: double.maxFinite, child: FolderTreeView( rootFolder: notesFolder, @@ -36,13 +36,13 @@ class FolderSelectionDialog extends StatelessWidget { } } -typedef void FolderSelectedCallback(NotesFolderFS folder); +typedef FolderSelectedCallback = void Function(NotesFolderFS folder); class FolderTreeView extends StatelessWidget { final NotesFolderFS rootFolder; final FolderSelectedCallback onFolderEntered; - FolderTreeView({ + const FolderTreeView({ Key? key, required this.rootFolder, required this.onFolderEntered, @@ -65,7 +65,7 @@ class FolderMiniTile extends StatefulWidget { final NotesFolderFS folder; final FolderSelectedCallback onTap; - FolderMiniTile({ + const FolderMiniTile({ required this.folder, required this.onTap, }); @@ -135,12 +135,12 @@ class FolderMiniTileState extends State { if (!_isExpanded) return Container(); var children = []; - widget.folder.subFolders.forEach((folder) { + for (var folder in widget.folder.subFolders) { children.add(FolderMiniTile( folder: folder as NotesFolderFS, onTap: widget.onTap, )); - }); + } return Container( margin: const EdgeInsets.only(left: 8.0), diff --git a/lib/widgets/folder_tree_view.dart b/lib/widgets/folder_tree_view.dart index c1d7aa37..d033d932 100644 --- a/lib/widgets/folder_tree_view.dart +++ b/lib/widgets/folder_tree_view.dart @@ -8,7 +8,7 @@ import 'package:flutter/material.dart'; import 'package:gitjournal/core/notes_folder_fs.dart'; -typedef void FolderSelectedCallback(NotesFolderFS folder); +typedef FolderSelectedCallback = void Function(NotesFolderFS folder); class FolderTreeView extends StatefulWidget { final NotesFolderFS rootFolder; @@ -17,7 +17,7 @@ class FolderTreeView extends StatefulWidget { final Function onFolderUnselected; final FolderSelectedCallback onFolderEntered; - FolderTreeView({ + const FolderTreeView({ Key? key, required this.rootFolder, required this.onFolderEntered, @@ -79,7 +79,7 @@ class FolderTile extends StatefulWidget { final FolderSelectedCallback onLongPress; final NotesFolderFS? selectedFolder; - FolderTile({ + const FolderTile({ required this.folder, required this.onTap, required this.onLongPress, @@ -169,14 +169,14 @@ class FolderTileState extends State { if (!_isExpanded) return Container(); var children = []; - widget.folder.subFolders.forEach((folder) { + for (var folder in widget.folder.subFolders) { children.add(FolderTile( folder: folder as NotesFolderFS, onTap: widget.onTap, onLongPress: widget.onLongPress, selectedFolder: widget.selectedFolder, )); - }); + } return Container( margin: const EdgeInsets.only(left: 16.0), diff --git a/lib/widgets/highlighted_text.dart b/lib/widgets/highlighted_text.dart index 18eccf5c..db171b44 100644 --- a/lib/widgets/highlighted_text.dart +++ b/lib/widgets/highlighted_text.dart @@ -16,7 +16,8 @@ class HighlightedText extends StatelessWidget { final TextOverflow? overflow; final int? maxLines; - HighlightedText({ + const HighlightedText({ + Key? key, required this.text, required this.highlightText, required this.highlightTextLowerCase, @@ -24,7 +25,7 @@ class HighlightedText extends StatelessWidget { this.highlightStyle, this.overflow, this.maxLines, - }); + }) : super(key: key); @override Widget build(BuildContext context) { diff --git a/lib/widgets/images/image_caption.dart b/lib/widgets/images/image_caption.dart index 9f0a4e6d..341dda50 100644 --- a/lib/widgets/images/image_caption.dart +++ b/lib/widgets/images/image_caption.dart @@ -20,7 +20,7 @@ class ImageCaption extends StatelessWidget { final String altText; final String tooltip; final bool overlay; - ImageCaption(this.altText, this.tooltip, this.overlay); + const ImageCaption(this.altText, this.tooltip, this.overlay); @override Widget build(BuildContext context) { diff --git a/lib/widgets/images/image_details.dart b/lib/widgets/images/image_details.dart index 3367ab56..03040561 100644 --- a/lib/widgets/images/image_details.dart +++ b/lib/widgets/images/image_details.dart @@ -17,7 +17,7 @@ import 'package:gitjournal/widgets/images/themable_image.dart'; class ImageDetails extends StatefulWidget { final ThemableImage image; final String caption; - ImageDetails(this.image, this.caption); + const ImageDetails(this.image, this.caption); @override _ImageDetailsState createState() => _ImageDetailsState(); diff --git a/lib/widgets/images/markdown_image.dart b/lib/widgets/images/markdown_image.dart index 108f2076..c48a73fd 100644 --- a/lib/widgets/images/markdown_image.dart +++ b/lib/widgets/images/markdown_image.dart @@ -33,7 +33,7 @@ class MarkdownImage extends StatelessWidget { // FIXME: Avoid using dynamic! final Future data; - MarkdownImage._( + const MarkdownImage._( this.data, this.width, this.height, String? altText, String? tooltip) : altText = altText ?? "", tooltip = tooltip ?? ""; diff --git a/lib/widgets/images/themable_image.dart b/lib/widgets/images/themable_image.dart index 6c3155fd..5e45e202 100644 --- a/lib/widgets/images/themable_image.dart +++ b/lib/widgets/images/themable_image.dart @@ -23,7 +23,7 @@ class ThemableImage extends StatelessWidget { final ColorCondition colorCondition; final Color bg; - ThemableImage.image( + const ThemableImage.image( this.file, { this.width, this.height, @@ -34,7 +34,7 @@ class ThemableImage extends StatelessWidget { themingCondition = ThemingCondition.none, colorCondition = ColorCondition.all; - ThemableImage.svg( + const ThemableImage.svg( this.string, { this.width, this.height, @@ -187,7 +187,7 @@ bool _hasBackground(Drawable draw, double width, double height, Drawable _themeDrawable( Drawable draw, Color? Function(Color? color) transformColor) { - if (draw is DrawableStyleable && !(draw is DrawableGroup)) { + if (draw is DrawableStyleable && draw is! DrawableGroup) { final DrawableStyleable drawStylable = draw; draw = drawStylable.mergeStyle(DrawableStyle( stroke: drawStylable.style!.stroke != null && diff --git a/lib/widgets/journal_editor_header.dart b/lib/widgets/journal_editor_header.dart index ef90dcae..2a897af0 100644 --- a/lib/widgets/journal_editor_header.dart +++ b/lib/widgets/journal_editor_header.dart @@ -13,7 +13,7 @@ import 'package:gitjournal/core/note.dart'; class JournalEditorHeader extends StatelessWidget { final Note note; - JournalEditorHeader(this.note); + const JournalEditorHeader(this.note); @override Widget build(BuildContext context) { diff --git a/lib/widgets/new_note_nav_bar.dart b/lib/widgets/new_note_nav_bar.dart index c1f01844..2075d455 100644 --- a/lib/widgets/new_note_nav_bar.dart +++ b/lib/widgets/new_note_nav_bar.dart @@ -16,7 +16,7 @@ import 'package:gitjournal/editors/common_types.dart'; class NewNoteNavBar extends StatelessWidget { final Func1 onPressed; - NewNoteNavBar({required this.onPressed}); + const NewNoteNavBar({required this.onPressed}); @override Widget build(BuildContext context) { diff --git a/lib/widgets/note_tag_editor.dart b/lib/widgets/note_tag_editor.dart index 046438f5..7df8fa0d 100644 --- a/lib/widgets/note_tag_editor.dart +++ b/lib/widgets/note_tag_editor.dart @@ -15,7 +15,7 @@ class NoteTagEditor extends StatefulWidget { final Set selectedTags; final Set allTags; - NoteTagEditor({required this.selectedTags, required this.allTags}); + const NoteTagEditor({required this.selectedTags, required this.allTags}); @override _NoteTagEditorState createState() => _NoteTagEditorState(); @@ -98,7 +98,7 @@ class _NoteTagEditorState extends State { Widget _buildTagTile(String tag) { var containsTag = _selectedTags.contains(tag); - var _onTap = () { + void _onTap() { setState(() { if (containsTag) { _selectedTags.remove(tag); @@ -106,7 +106,8 @@ class _NoteTagEditorState extends State { _selectedTags.add(tag); } }); - }; + } + return ListTile( leading: const FaIcon(FontAwesomeIcons.tag), title: Text(tag), diff --git a/lib/widgets/note_viewer.dart b/lib/widgets/note_viewer.dart index 708be529..6cbc1b46 100644 --- a/lib/widgets/note_viewer.dart +++ b/lib/widgets/note_viewer.dart @@ -105,7 +105,7 @@ class NoteViewer extends StatelessWidget { class NoteTitleHeader extends StatelessWidget { final String header; - NoteTitleHeader(this.header); + const NoteTitleHeader(this.header); @override Widget build(BuildContext context) { diff --git a/lib/widgets/notes_backlinks.dart b/lib/widgets/notes_backlinks.dart index e730c9b2..05df9fa6 100644 --- a/lib/widgets/notes_backlinks.dart +++ b/lib/widgets/notes_backlinks.dart @@ -26,7 +26,7 @@ class NoteBacklinkRenderer extends StatefulWidget { final NotesFolder parentFolder; final NoteLinksView linksView; - NoteBacklinkRenderer({ + const NoteBacklinkRenderer({ required this.note, required this.rootFolder, required this.parentFolder, @@ -48,7 +48,7 @@ class _NoteBacklinkRendererState extends State { } Future _initStateAsync() async { - var predicate = (Note n) async { + Future predicate(Note n) async { // Log.d("NoteBacklinkRenderer Predicate", props: {"filePath": n.filePath}); var links = await widget.linksView.fetchLinks(n); @@ -66,7 +66,7 @@ class _NoteBacklinkRendererState extends State { // Log.d("NoteBacklinkRenderer Predicate ${matchedLink != null}"); return matchedLink != null; - }; + } var l = await widget.rootFolder.matchNotes(predicate); if (!mounted) return; @@ -124,7 +124,7 @@ class NoteSnippet extends StatelessWidget { final Note parentNote; final void Function() onTap; - NoteSnippet({ + const NoteSnippet({ required this.note, required this.parentNote, required this.onTap, @@ -148,7 +148,7 @@ class NoteSnippet extends StatelessWidget { width: MediaQuery.of(context).size.width, child: Column( children: [ - Text('$title', style: textTheme.bodyText1), + Text(title, style: textTheme.bodyText1), const SizedBox(height: 8.0), _buildSummary(context), ], diff --git a/lib/widgets/rename_dialog.dart b/lib/widgets/rename_dialog.dart index 10f427d7..c784e229 100644 --- a/lib/widgets/rename_dialog.dart +++ b/lib/widgets/rename_dialog.dart @@ -18,7 +18,7 @@ class RenameDialog extends StatefulWidget { final String inputDecoration; final String dialogTitle; - RenameDialog({ + const RenameDialog({ required this.oldPath, required this.inputDecoration, required this.dialogTitle, diff --git a/lib/widgets/scroll_view_without_animation.dart b/lib/widgets/scroll_view_without_animation.dart index fcb2fbaf..d5295e11 100644 --- a/lib/widgets/scroll_view_without_animation.dart +++ b/lib/widgets/scroll_view_without_animation.dart @@ -10,7 +10,7 @@ class ScrollViewWithoutAnimation extends StatelessWidget { final Widget child; final Axis scrollDirection; - ScrollViewWithoutAnimation({ + const ScrollViewWithoutAnimation({ required this.child, this.scrollDirection = Axis.vertical, }); diff --git a/lib/widgets/sorting_mode_selector.dart b/lib/widgets/sorting_mode_selector.dart index e696f84a..8073401a 100644 --- a/lib/widgets/sorting_mode_selector.dart +++ b/lib/widgets/sorting_mode_selector.dart @@ -15,7 +15,7 @@ import 'package:gitjournal/settings/settings_screen.dart'; class SortingModeSelector extends StatefulWidget { final SortingMode selectedMode; - SortingModeSelector(this.selectedMode); + const SortingModeSelector(this.selectedMode); @override _SortingModeSelectorState createState() => _SortingModeSelectorState(); diff --git a/lib/widgets/sync_button.dart b/lib/widgets/sync_button.dart index 4da55f00..6b8e40d1 100644 --- a/lib/widgets/sync_button.dart +++ b/lib/widgets/sync_button.dart @@ -134,7 +134,7 @@ class BlinkingIcon extends StatefulWidget { final Widget child; final int interval; - BlinkingIcon({required this.child, this.interval = 500, Key? key}) + const BlinkingIcon({required this.child, this.interval = 500, Key? key}) : super(key: key); @override @@ -180,7 +180,7 @@ class _BlinkingIconState extends State class GitPendingChangesBadge extends StatelessWidget { final Widget child; - GitPendingChangesBadge({required this.child}); + const GitPendingChangesBadge({required this.child}); @override Widget build(BuildContext context) { diff --git a/pubspec.lock b/pubspec.lock index ab1bce42..326149d7 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -537,6 +537,13 @@ packages: url: "https://github.com/dirkbo/flutter_launcher_icons" source: git version: "0.9.1" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" flutter_localizations: dependency: "direct main" description: flutter @@ -859,6 +866,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.1" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" logging: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 617fa033..e670927d 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -116,6 +116,7 @@ dev_dependencies: dashbook: ^0.1.3 dart_code_metrics: ^4.1.0 hive_generator: ^1.1.0 + flutter_lints: ^1.0.4 flutter: uses-material-design: true diff --git a/scripts/setup_env.dart b/scripts/setup_env.dart index 6e4e8656..87b8010a 100755 --- a/scripts/setup_env.dart +++ b/scripts/setup_env.dart @@ -1,5 +1,4 @@ #!/usr/bin/env dart - // SPDX-FileCopyrightText: 2019-2021 Vishesh Handa // // SPDX-License-Identifier: AGPL-3.0-or-later @@ -38,7 +37,7 @@ Future main(List args) async { print(contents); - final filename = 'lib/.env.dart'; + const filename = 'lib/.env.dart'; await File(filename).writeAsString(contents); return 0; diff --git a/test/apis/github_test.dart b/test/apis/github_test.dart index 98246031..a0f0e577 100644 --- a/test/apis/github_test.dart +++ b/test/apis/github_test.dart @@ -30,11 +30,11 @@ void main() { List list = jsonDecode(jsonString); var repos = []; - list.forEach((dynamic d) { + for (var d in list) { var map = Map.from(d); var repo = GitHub.repoFromJson(map); repos.add(repo); - }); + } expect(repos.length, 2); }); diff --git a/test/apis/gitlab_test.dart b/test/apis/gitlab_test.dart index 5acd33b7..2a0e2c92 100644 --- a/test/apis/gitlab_test.dart +++ b/test/apis/gitlab_test.dart @@ -30,11 +30,11 @@ void main() { List list = jsonDecode(jsonString); var repos = []; - list.forEach((dynamic d) { + for (var d in list) { var map = Map.from(d); var repo = GitLab.repoFromJson(map); repos.add(repo); - }); + } expect(repos.length, 2); }); diff --git a/test/core/markdown_latex_test.dart b/test/core/markdown_latex_test.dart index 975b988c..ade0b36a 100644 --- a/test/core/markdown_latex_test.dart +++ b/test/core/markdown_latex_test.dart @@ -12,7 +12,7 @@ import 'package:gitjournal/markdown/markdown_latex.dart'; void main() { test('Should parse both', () async { var body = """# Hi -\\[ x = {-b \pm \sqrt{b^2-4ac} \over 2a} \\]"""; +\\[ x = {-b pm sqrt{b^2-4ac} over 2a} \\]"""; var lines = body.split('\n'); diff --git a/test/core/notes_materialized_view_test.dart b/test/core/notes_materialized_view_test.dart index f76bf96f..ce2f24bf 100644 --- a/test/core/notes_materialized_view_test.dart +++ b/test/core/notes_materialized_view_test.dart @@ -31,7 +31,7 @@ void main() { Hive.init(tempDir.path); }); - var _createExampleNote = () async { + Future _createExampleNote() async { var content = """--- bar: Foo updated: 1626257689 @@ -47,13 +47,13 @@ Hello var parentFolder = NotesFolderFS(null, tempDir.path, config); var note = Note(parentFolder, notePath, DateTime.now()); return note; - }; + } test('Test', () async { var random = Random().nextInt(10000).toString(); - var compute = (Note note) async { + Future compute(Note note) async { return random; - }; + } var view = NotesMaterializedView( name: '_test_box', diff --git a/test/core/worker_queue_test.dart b/test/core/worker_queue_test.dart index 20327791..5217b8bf 100644 --- a/test/core/worker_queue_test.dart +++ b/test/core/worker_queue_test.dart @@ -11,7 +11,7 @@ import 'package:gitjournal/core/worker_queue.dart'; void main() { group('WorkerQueue', () { test('Simple', () async { - var func = (int input) => input + 5; + int func(int input) => input + 5; var worker = WorkerQueue(func); expect(await worker.call(2), 7); diff --git a/test/markdown_bug_test.dart b/test/markdown_bug_test.dart index 47b7f1f9..70d6cdf9 100644 --- a/test/markdown_bug_test.dart +++ b/test/markdown_bug_test.dart @@ -9,7 +9,7 @@ import 'package:test/test.dart'; /// Parse [[term]] class _WikiLinkSyntax extends md.InlineSyntax { - static final String _pattern = r'\[\[([^\[\]]+)\]\]'; + static const String _pattern = r'\[\[([^\[\]]+)\]\]'; _WikiLinkSyntax() : super(_pattern); @@ -36,7 +36,7 @@ class _WikiLinkSyntax extends md.InlineSyntax { /// Parse [task list items](https://github.github.com/gfm/#task-list-items-extension-). class _TaskListSyntax extends md.InlineSyntax { // FIXME: Waiting for dart-lang/markdown#269 to land - static final String _pattern = r'^ *\[([ xX])\] +'; + static const String _pattern = r'^ *\[([ xX])\] +'; _TaskListSyntax() : super(_pattern); diff --git a/test/note_storage_test.dart b/test/note_storage_test.dart index ef2c21b2..4641074f 100644 --- a/test/note_storage_test.dart +++ b/test/note_storage_test.dart @@ -74,7 +74,7 @@ void main() { loadedNotes.add(note); }); - var sortFn = (Note n1, Note n2) => n1.filePath.compareTo(n2.filePath); + sortFn(Note n1, Note n2) => n1.filePath.compareTo(n2.filePath); loadedNotes.sort(sortFn); notes.sort(sortFn); diff --git a/test/processors/image_extractor_test.dart b/test/processors/image_extractor_test.dart index 7af6b7dd..ffc1d63d 100644 --- a/test/processors/image_extractor_test.dart +++ b/test/processors/image_extractor_test.dart @@ -19,8 +19,8 @@ void main() { var images = p.extract(body); expect(images, { - NoteImage(alt: 'alt', url: '../final.img'), - NoteImage(alt: 'alt2', url: '../final2.img'), + const NoteImage(alt: 'alt', url: '../final.img'), + const NoteImage(alt: 'alt2', url: '../final2.img'), }); }); } diff --git a/test/processors/text_visitor_test.dart b/test/processors/text_visitor_test.dart index 82d4e6f8..a038dd1d 100644 --- a/test/processors/text_visitor_test.dart +++ b/test/processors/text_visitor_test.dart @@ -29,9 +29,9 @@ void main() { var body = "Hello *Hi* **How**"; var result = ""; - var callback = (String content) { + void callback(String content) { result += content + "-"; - }; + } _visit(body, callback); expect(result, "Hello -Hi- -How-"); @@ -41,9 +41,9 @@ void main() { var body = "Hello`foo`"; var result = ""; - var callback = (String content) { + void callback(String content) { result += content + "-"; - }; + } _visit(body, callback); expect(result, "Hello-"); @@ -58,9 +58,9 @@ Done """; var result = ""; - var callback = (String content) { + void callback(String content) { result += content + "-"; - }; + } _visit(body, callback); expect(result, "Hi-Done-");