From 4cbfcdc2e3aed69294c0f08a4a672647b66e548a Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 26 Jul 2020 03:03:07 +0900 Subject: [PATCH] fixed more lint issues (effective dart style) --- analysis_options.yaml | 25 ++++++++++++--- lib/main.dart | 4 +-- lib/model/image_metadata.dart | 3 +- lib/model/settings.dart | 1 + lib/model/source/collection_lens.dart | 2 +- lib/services/image_file_service.dart | 5 +-- lib/utils/color_utils.dart | 2 +- .../album/grid/list_section_layout.dart | 20 ------------ lib/widgets/album/thumbnail/overlay.dart | 2 +- .../selection_action_delegate.dart | 8 ++--- lib/widgets/common/aves_filter_chip.dart | 4 +-- lib/widgets/debug_page.dart | 32 +++++++++---------- lib/widgets/fullscreen/debug.dart | 16 +++++----- lib/widgets/fullscreen/info/info_page.dart | 2 +- lib/widgets/fullscreen/overlay/bottom.dart | 4 +-- lib/widgets/fullscreen/overlay/video.dart | 2 +- lib/widgets/home_page.dart | 4 +-- lib/widgets/stats/stats.dart | 4 +-- lib/widgets/welcome_page.dart | 4 +-- 19 files changed, 72 insertions(+), 72 deletions(-) diff --git a/analysis_options.yaml b/analysis_options.yaml index 157ed9498..780713728 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -4,9 +4,26 @@ analyzer: exclude: - lib/generated_plugin_registrant.dart +# strong-mode: +# implicit-casts: false +# implicit-dynamic: false + linter: rules: - - always_declare_return_types - - prefer_const_constructors - - prefer_const_constructors_in_immutables - - prefer_const_declarations + avoid_function_literals_in_foreach_calls: false # benefit? + lines_longer_than_80_chars: false # nope + + avoid_classes_with_only_static_members: false # maybe? + prefer_relative_imports: false # check IDE support (auto import, file move) + public_member_api_docs: false # maybe? + + always_declare_return_types: true + avoid_types_on_closure_parameters: true + constant_identifier_names: true + prefer_const_constructors: true + prefer_const_constructors_in_immutables: true + prefer_const_declarations: true + prefer_function_declarations_over_variables: true + prefer_interpolation_to_compose_strings: true + unnecessary_brace_in_string_interps: true + unnecessary_lambdas: true diff --git a/lib/main.dart b/lib/main.dart index 8d8f4722c..6216fdcf0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -58,9 +58,9 @@ class _AvesAppState extends State { ), ), ), - home: FutureBuilder( + home: FutureBuilder( future: _appSetup, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return const Icon(AIcons.error); if (snapshot.connectionState != ConnectionState.done) return const Scaffold(); return settings.hasAcceptedTerms ? const HomePage() : const WelcomePage(); diff --git a/lib/model/image_metadata.dart b/lib/model/image_metadata.dart index fae1031d6..7c7e32490 100644 --- a/lib/model/image_metadata.dart +++ b/lib/model/image_metadata.dart @@ -179,11 +179,12 @@ class AddressDetails { } } +@immutable class FavouriteRow { final int contentId; final String path; - FavouriteRow({ + const FavouriteRow({ this.contentId, this.path, }); diff --git a/lib/model/settings.dart b/lib/model/settings.dart index 0cf95928c..7de40ad4c 100644 --- a/lib/model/settings.dart +++ b/lib/model/settings.dart @@ -76,6 +76,7 @@ class Settings { // convenience methods + // ignore: avoid_positional_boolean_parameters bool getBoolOrDefault(String key, bool defaultValue) => _prefs.getKeys().contains(key) ? _prefs.getBool(key) : defaultValue; T getEnumOrDefault(String key, T defaultValue, Iterable values) { diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index 565847ee5..75c0a0d3f 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -168,7 +168,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel ]); break; case SortFactor.name: - final byAlbum = groupBy(_filteredEntries, (entry) => entry.directory); + final byAlbum = groupBy(_filteredEntries, (entry) => entry.directory); int compare(a, b) { final ua = source.getUniqueAlbumName(a); final ub = source.getUniqueAlbumName(b); diff --git a/lib/services/image_file_service.dart b/lib/services/image_file_service.dart index 94412adf3..bd3135273 100644 --- a/lib/services/image_file_service.dart +++ b/lib/services/image_file_service.dart @@ -192,11 +192,12 @@ class ImageFileService { } } +@immutable class ImageOpEvent { final bool success; final String uri; - ImageOpEvent({ + const ImageOpEvent({ this.success, this.uri, }); @@ -226,7 +227,7 @@ class ImageOpEvent { class MoveOpEvent extends ImageOpEvent { final Map newFields; - MoveOpEvent({bool success, String uri, this.newFields}) + const MoveOpEvent({bool success, String uri, this.newFields}) : super( success: success, uri: uri, diff --git a/lib/utils/color_utils.dart b/lib/utils/color_utils.dart index 8a22b11fe..d9842ead6 100644 --- a/lib/utils/color_utils.dart +++ b/lib/utils/color_utils.dart @@ -5,7 +5,7 @@ final Map _stringColors = {}; Color stringToColor(String string, {double saturation = .8, double lightness = .6}) { var color = _stringColors[string]; if (color == null) { - final hash = string.codeUnits.fold(0, (prev, el) => prev = el + ((prev << 5) - prev)); + final hash = string.codeUnits.fold(0, (prev, el) => prev = el + ((prev << 5) - prev)); final hue = (hash % 360).toDouble(); color = HSLColor.fromAHSL(1.0, hue, saturation, lightness).toColor(); _stringColors[string] = color; diff --git a/lib/widgets/album/grid/list_section_layout.dart b/lib/widgets/album/grid/list_section_layout.dart index f9eec6a7a..6b7aef300 100644 --- a/lib/widgets/album/grid/list_section_layout.dart +++ b/lib/widgets/album/grid/list_section_layout.dart @@ -4,7 +4,6 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/album/grid/header_generic.dart'; import 'package:aves/widgets/album/grid/tile_extent_manager.dart'; -import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -145,25 +144,6 @@ class SectionedListLayout { final top = sectionLayout.indexToLayoutOffset(listIndex); return Rect.fromLTWH(left, top, tileExtent, tileExtent); } - - int rowIndex(dynamic sectionKey, List builtIds) { - if (!collection.sections.containsKey(sectionKey)) return null; - - final section = collection.sections[sectionKey]; - final firstId = builtIds.first; - final firstIndexInSection = section.indexWhere((entry) => entry.contentId == firstId); - if (firstIndexInSection % columnCount != 0) return null; - - final collectionIds = section.skip(firstIndexInSection).take(builtIds.length).map((entry) => entry.contentId); - final eq = const IterableEquality().equals; - if (eq(builtIds, collectionIds)) { - final sectionLayout = sectionLayouts.firstWhere((section) => section.sectionKey == sectionKey, orElse: () => null); - if (sectionLayout == null) return null; - return sectionLayout.firstIndex + 1 + firstIndexInSection ~/ columnCount; - } - - return null; - } } class SectionLayout { diff --git a/lib/widgets/album/thumbnail/overlay.dart b/lib/widgets/album/thumbnail/overlay.dart index a29f8bc72..8b839d9c4 100644 --- a/lib/widgets/album/thumbnail/overlay.dart +++ b/lib/widgets/album/thumbnail/overlay.dart @@ -57,7 +57,7 @@ class ThumbnailSelectionOverlay extends StatelessWidget { @override Widget build(BuildContext context) { - final duration = Durations.thumbnailOverlayAnimation; + const duration = Durations.thumbnailOverlayAnimation; final fontSize = min(14.0, (extent / 8)).roundToDouble(); final iconSize = fontSize * 2; final collection = Provider.of(context); diff --git a/lib/widgets/common/action_delegates/selection_action_delegate.dart b/lib/widgets/common/action_delegates/selection_action_delegate.dart index 0637168c5..e263f58b0 100644 --- a/lib/widgets/common/action_delegates/selection_action_delegate.dart +++ b/lib/widgets/common/action_delegates/selection_action_delegate.dart @@ -105,11 +105,11 @@ class SelectionActionDelegate with FeedbackMixin, PermissionAwareMixin { final selection = collection.selection.toList(); if (!await checkStoragePermission(context, selection)) return; - _showOpReport( + _showOpReport( context: context, selection: selection, opStream: ImageFileService.move(selection, copy: copy, destinationAlbum: destinationAlbum), - onDone: (Set processed) async { + onDone: (processed) async { debugPrint('$runtimeType _moveSelection onDone'); final movedOps = processed.where((e) => e.success); final movedCount = movedOps.length; @@ -207,11 +207,11 @@ class SelectionActionDelegate with FeedbackMixin, PermissionAwareMixin { if (!await checkStoragePermission(context, selection)) return; - _showOpReport( + _showOpReport( context: context, selection: selection, opStream: ImageFileService.delete(selection), - onDone: (Set processed) { + onDone: (processed) { final deletedUris = processed.where((e) => e.success).map((e) => e.uri); final deletedCount = deletedUris.length; final selectionCount = selection.length; diff --git a/lib/widgets/common/aves_filter_chip.dart b/lib/widgets/common/aves_filter_chip.dart index 19adca22d..8cce670b0 100644 --- a/lib/widgets/common/aves_filter_chip.dart +++ b/lib/widgets/common/aves_filter_chip.dart @@ -157,9 +157,9 @@ class _AvesFilterChipState extends State { } : null, borderRadius: borderRadius, - child: FutureBuilder( + child: FutureBuilder( future: _colorFuture, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { final outlineColor = snapshot.hasData ? snapshot.data : Colors.transparent; return DecoratedBox( decoration: BoxDecoration( diff --git a/lib/widgets/debug_page.dart b/lib/widgets/debug_page.dart index a05ead50b..736151d48 100644 --- a/lib/widgets/debug_page.dart +++ b/lib/widgets/debug_page.dart @@ -134,16 +134,16 @@ class DebugPageState extends State { child: Text('Glide disk cache: ?'), ), const SizedBox(width: 8), - RaisedButton( + const RaisedButton( onPressed: ImageFileService.clearSizedThumbnailDiskCache, - child: const Text('Clear'), + child: Text('Clear'), ), ], ), const Divider(), - FutureBuilder( + FutureBuilder( future: _dbFileSizeLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( @@ -160,9 +160,9 @@ class DebugPageState extends State { ); }, ), - FutureBuilder( + FutureBuilder( future: _dbEntryLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( @@ -179,9 +179,9 @@ class DebugPageState extends State { ); }, ), - FutureBuilder( + FutureBuilder( future: _dbDateLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( @@ -198,9 +198,9 @@ class DebugPageState extends State { ); }, ), - FutureBuilder( + FutureBuilder( future: _dbMetadataLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( @@ -217,9 +217,9 @@ class DebugPageState extends State { ); }, ), - FutureBuilder( + FutureBuilder( future: _dbAddressLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( @@ -236,9 +236,9 @@ class DebugPageState extends State { ); }, ), - FutureBuilder( + FutureBuilder( future: _dbFavouritesLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( @@ -308,9 +308,9 @@ class DebugPageState extends State { return ListView( padding: const EdgeInsets.all(16), children: [ - FutureBuilder( + FutureBuilder( future: _envLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = SplayTreeMap.of(snapshot.data.map((k, v) => MapEntry(k.toString(), v?.toString() ?? 'null'))); diff --git a/lib/widgets/fullscreen/debug.dart b/lib/widgets/fullscreen/debug.dart index 091ff4d5a..0ebf2129e 100644 --- a/lib/widgets/fullscreen/debug.dart +++ b/lib/widgets/fullscreen/debug.dart @@ -62,9 +62,9 @@ class _FullscreenDebugPageState extends State { return ListView( padding: const EdgeInsets.all(16), children: [ - FutureBuilder( + FutureBuilder( future: _dbDateLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = snapshot.data; @@ -81,9 +81,9 @@ class _FullscreenDebugPageState extends State { }, ), const SizedBox(height: 16), - FutureBuilder( + FutureBuilder( future: _dbMetadataLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = snapshot.data; @@ -107,9 +107,9 @@ class _FullscreenDebugPageState extends State { }, ), const SizedBox(height: 16), - FutureBuilder( + FutureBuilder( future: _dbAddressLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = snapshot.data; @@ -155,9 +155,9 @@ class _FullscreenDebugPageState extends State { return ListView( padding: const EdgeInsets.all(16), children: [ - FutureBuilder( + FutureBuilder( future: _contentResolverMetadataLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = SplayTreeMap.of(snapshot.data.map((k, v) { diff --git a/lib/widgets/fullscreen/info/info_page.dart b/lib/widgets/fullscreen/info/info_page.dart index dcc7b2229..e846ff362 100644 --- a/lib/widgets/fullscreen/info/info_page.dart +++ b/lib/widgets/fullscreen/info/info_page.dart @@ -60,7 +60,7 @@ class InfoPageState extends State { final mqViewInsetsBottom = mq.item2; final split = mqWidth > 400; - return ValueListenableBuilder( + return ValueListenableBuilder( valueListenable: widget.entryNotifier, builder: (context, entry, child) { final locationAtTop = split && entry.hasGps; diff --git a/lib/widgets/fullscreen/overlay/bottom.dart b/lib/widgets/fullscreen/overlay/bottom.dart index d4b8c0264..a3e21c8f6 100644 --- a/lib/widgets/fullscreen/overlay/bottom.dart +++ b/lib/widgets/fullscreen/overlay/bottom.dart @@ -82,9 +82,9 @@ class _FullscreenBottomOverlayState extends State { return Container( color: FullscreenOverlay.backgroundColor, padding: viewInsets + viewPadding.copyWith(top: 0), - child: FutureBuilder( + child: FutureBuilder( future: _detailLoader, - builder: (futureContext, AsyncSnapshot snapshot) { + builder: (futureContext, snapshot) { if (snapshot.connectionState == ConnectionState.done && !snapshot.hasError) { _lastDetails = snapshot.data; _lastEntry = entry; diff --git a/lib/widgets/fullscreen/overlay/video.dart b/lib/widgets/fullscreen/overlay/video.dart index 5cfaba055..a1b6d2270 100644 --- a/lib/widgets/fullscreen/overlay/video.dart +++ b/lib/widgets/fullscreen/overlay/video.dart @@ -98,7 +98,7 @@ class VideoControlOverlayState extends State with SingleTic @override Widget build(BuildContext context) { - final mq = context.select((mq) => Tuple3(mq.size.width, mq.viewInsets, mq.viewPadding)); + final mq = context.select>((mq) => Tuple3(mq.size.width, mq.viewInsets, mq.viewPadding)); final mqWidth = mq.item1; final mqViewInsets = mq.item2; final mqViewPadding = mq.item3; diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 33f715f1b..1444bc71b 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -92,9 +92,9 @@ class _HomePageState extends State { @override Widget build(BuildContext context) { - return FutureBuilder( + return FutureBuilder( future: _appSetup, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError) return const Icon(AIcons.error); if (snapshot.connectionState != ConnectionState.done) return const Scaffold(); if (AvesApp.mode == AppMode.view) { diff --git a/lib/widgets/stats/stats.dart b/lib/widgets/stats/stats.dart index b5e2d687f..ef5be10c1 100644 --- a/lib/widgets/stats/stats.dart +++ b/lib/widgets/stats/stats.dart @@ -54,7 +54,7 @@ class StatsPage extends StatelessWidget { text: 'No images', ); } else { - final byMimeTypes = groupBy(entries, (entry) => entry.mimeType).map((k, v) => MapEntry(k, v.length)); + final byMimeTypes = groupBy(entries, (entry) => entry.mimeType).map((k, v) => MapEntry(k, v.length)); final imagesByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('image/'))); final videoByMimeTypes = Map.fromEntries(byMimeTypes.entries.where((kv) => kv.key.startsWith('video/'))); final mimeDonuts = Wrap( @@ -120,7 +120,7 @@ class StatsPage extends StatelessWidget { Widget _buildMimeDonut(BuildContext context, String Function(num) label, Map byMimeTypes) { if (byMimeTypes.isEmpty) return const SizedBox.shrink(); - final sum = byMimeTypes.values.fold(0, (prev, v) => prev + v); + final sum = byMimeTypes.values.fold(0, (prev, v) => prev + v); final seriesData = byMimeTypes.entries.map((kv) => StringNumDatum(_cleanMime(kv.key), kv.value)).toList(); seriesData.sort((kv1, kv2) { diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart index 31ce653f6..9485b0d89 100644 --- a/lib/widgets/welcome_page.dart +++ b/lib/widgets/welcome_page.dart @@ -33,9 +33,9 @@ class _WelcomePageState extends State { child: Container( alignment: Alignment.center, padding: const EdgeInsets.all(16.0), - child: FutureBuilder( + child: FutureBuilder( future: _termsLoader, - builder: (context, AsyncSnapshot snapshot) { + builder: (context, snapshot) { if (snapshot.hasError || snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final terms = snapshot.data; return Column(