diff --git a/analysis_options.yaml b/analysis_options.yaml index 05191c021..537f9f075 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -29,6 +29,6 @@ linter: unnecessary_lambdas: true # misc - prefer_const_constructors: false # too noisy + prefer_const_constructors: true # should specify `const` as Dart does not build constants when using const constructors without it prefer_const_constructors_in_immutables: true prefer_const_declarations: true diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index 51c0c8926..f3d23bbc2 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -159,14 +159,14 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin { break; case EntryGroupFactor.none: sections = Map.fromEntries([ - MapEntry(SectionKey(), _filteredSortedEntries), + MapEntry(const SectionKey(), _filteredSortedEntries), ]); break; } break; case EntrySortFactor.size: sections = Map.fromEntries([ - MapEntry(SectionKey(), _filteredSortedEntries), + MapEntry(const SectionKey(), _filteredSortedEntries), ]); break; case EntrySortFactor.name: diff --git a/lib/theme/themes.dart b/lib/theme/themes.dart index a572217fd..0c9e692e6 100644 --- a/lib/theme/themes.dart +++ b/lib/theme/themes.dart @@ -12,10 +12,10 @@ class Themes { scaffoldBackgroundColor: Colors.grey.shade900, dialogBackgroundColor: Colors.grey[850], toggleableActiveColor: _accentColor, - tooltipTheme: TooltipThemeData( + tooltipTheme: const TooltipThemeData( verticalOffset: 32, ), - appBarTheme: AppBarTheme( + appBarTheme: const AppBarTheme( textTheme: TextTheme( headline6: TextStyle( fontSize: 20, @@ -24,7 +24,7 @@ class Themes { ), ), ), - colorScheme: ColorScheme.dark( + colorScheme: const ColorScheme.dark( primary: _accentColor, secondary: _accentColor, onPrimary: Colors.white, @@ -32,7 +32,7 @@ class Themes { ), snackBarTheme: SnackBarThemeData( backgroundColor: Colors.grey.shade800, - contentTextStyle: TextStyle( + contentTextStyle: const TextStyle( color: Colors.white, ), behavior: SnackBarBehavior.floating, diff --git a/lib/utils/constants.dart b/lib/utils/constants.dart index db979853e..836a68a2b 100644 --- a/lib/utils/constants.dart +++ b/lib/utils/constants.dart @@ -15,10 +15,12 @@ class Constants { fontFeatures: [FontFeature.enable('smcp')], ); - static const embossShadow = Shadow( - color: Colors.black, - offset: Offset(0.5, 1.0), - ); + static const embossShadows = [ + Shadow( + color: Colors.black, + offset: Offset(0.5, 1.0), + ) + ]; static const overlayUnknown = '—'; // em dash diff --git a/lib/utils/time_utils.dart b/lib/utils/time_utils.dart index bd8d9bebd..4769b2557 100644 --- a/lib/utils/time_utils.dart +++ b/lib/utils/time_utils.dart @@ -23,7 +23,7 @@ extension ExtraDateTime on DateTime { bool get isToday => isAtSameDayAs(DateTime.now()); - bool get isYesterday => isAtSameDayAs(DateTime.now().subtract(Duration(days: 1))); + bool get isYesterday => isAtSameDayAs(DateTime.now().subtract(const Duration(days: 1))); bool get isThisMonth => isAtSameMonthAs(DateTime.now()); diff --git a/lib/widgets/about/about_page.dart b/lib/widgets/about/about_page.dart index d368bf332..31f2a3091 100644 --- a/lib/widgets/about/about_page.dart +++ b/lib/widgets/about/about_page.dart @@ -18,15 +18,15 @@ class AboutPage extends StatelessWidget { child: CustomScrollView( slivers: [ SliverPadding( - padding: EdgeInsets.only(top: 16), + padding: const EdgeInsets.only(top: 16), sliver: SliverList( delegate: SliverChildListDelegate( [ AppReference(), - Divider(), + const Divider(), AboutUpdate(), AboutCredits(), - Divider(), + const Divider(), ], ), ), diff --git a/lib/widgets/about/app_ref.dart b/lib/widgets/about/app_ref.dart index 963fc9146..8d309ee5e 100644 --- a/lib/widgets/about/app_ref.dart +++ b/lib/widgets/about/app_ref.dart @@ -28,14 +28,14 @@ class _AppReferenceState extends State { children: [ _buildAvesLine(), _buildFlutterLine(), - SizedBox(height: 16), + const SizedBox(height: 16), ], ), ); } Widget _buildAvesLine() { - final style = TextStyle( + const style = TextStyle( fontSize: 20, fontWeight: FontWeight.normal, letterSpacing: 1.0, @@ -66,7 +66,7 @@ class _AppReferenceState extends State { children: [ WidgetSpan( child: Padding( - padding: EdgeInsetsDirectional.only(end: 4), + padding: const EdgeInsetsDirectional.only(end: 4), child: FlutterLogo( size: style.fontSize! * 1.25, ), diff --git a/lib/widgets/about/credits.dart b/lib/widgets/about/credits.dart index 8cf4f1a5e..ce081b1cf 100644 --- a/lib/widgets/about/credits.dart +++ b/lib/widgets/about/credits.dart @@ -9,12 +9,12 @@ class AboutCredits extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ConstrainedBox( - constraints: BoxConstraints(minHeight: 48), + constraints: const BoxConstraints(minHeight: 48), child: Align( alignment: AlignmentDirectional.centerStart, child: Text(context.l10n.aboutCredits, style: Constants.titleTextStyle), @@ -24,7 +24,7 @@ class AboutCredits extends StatelessWidget { TextSpan( children: [ TextSpan(text: context.l10n.aboutCreditsWorldAtlas1), - WidgetSpan( + const WidgetSpan( child: LinkChip( text: 'World Atlas', url: 'https://github.com/topojson/world-atlas', @@ -36,7 +36,7 @@ class AboutCredits extends StatelessWidget { ], ), ), - SizedBox(height: 16), + const SizedBox(height: 16), ], ), ); diff --git a/lib/widgets/about/licenses.dart b/lib/widgets/about/licenses.dart index 7f029ee4f..55689796f 100644 --- a/lib/widgets/about/licenses.dart +++ b/lib/widgets/about/licenses.dart @@ -36,12 +36,12 @@ class _LicensesState extends State { @override Widget build(BuildContext context) { return SliverPadding( - padding: EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric(horizontal: 8), sliver: SliverList( delegate: SliverChildListDelegate( [ _buildHeader(), - SizedBox(height: 16), + const SizedBox(height: 16), AvesExpansionTile( title: context.l10n.aboutLicensesAndroidLibraries, color: BrandColors.android, @@ -76,7 +76,7 @@ class _LicensesState extends State { // as of Flutter v1.22.4, `cardColor` is used as a background color by `LicensePage` cardColor: Theme.of(context).scaffoldBackgroundColor, ), - child: LicensePage(), + child: const LicensePage(), ), ), ), @@ -91,18 +91,18 @@ class _LicensesState extends State { Widget _buildHeader() { return Padding( - padding: EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric(horizontal: 8), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ConstrainedBox( - constraints: BoxConstraints(minHeight: 48), + constraints: const BoxConstraints(minHeight: 48), child: Align( alignment: AlignmentDirectional.centerStart, child: Text(context.l10n.aboutLicenses, style: Constants.titleTextStyle), ), ), - SizedBox(height: 8), + const SizedBox(height: 8), Text(context.l10n.aboutLicensesBanner), ], ), @@ -122,17 +122,17 @@ class LicenseRow extends StatelessWidget { final subColor = bodyTextStyle.color!.withOpacity(.6); return Padding( - padding: EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric(vertical: 8), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ LinkChip( text: package.name, url: package.sourceUrl, - textStyle: TextStyle(fontWeight: FontWeight.bold), + textStyle: const TextStyle(fontWeight: FontWeight.bold), ), Padding( - padding: EdgeInsetsDirectional.only(start: 16), + padding: const EdgeInsetsDirectional.only(start: 16), child: LinkChip( text: package.license, url: package.licenseUrl, diff --git a/lib/widgets/about/news_badge.dart b/lib/widgets/about/news_badge.dart index 69a571dde..7ec8d6c1a 100644 --- a/lib/widgets/about/news_badge.dart +++ b/lib/widgets/about/news_badge.dart @@ -1,9 +1,11 @@ import 'package:flutter/material.dart'; class AboutNewsBadge extends StatelessWidget { + const AboutNewsBadge(); + @override Widget build(BuildContext context) { - return Icon( + return const Icon( Icons.circle, size: 12, color: Colors.red, diff --git a/lib/widgets/about/update.dart b/lib/widgets/about/update.dart index 95d923d8e..5b76768f4 100644 --- a/lib/widgets/about/update.dart +++ b/lib/widgets/about/update.dart @@ -25,22 +25,22 @@ class _AboutUpdateState extends State { future: _updateChecker, builder: (context, snapshot) { final newVersionAvailable = snapshot.data == true; - if (!newVersionAvailable) return SizedBox(); + if (!newVersionAvailable) return const SizedBox(); return Column( children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ ConstrainedBox( - constraints: BoxConstraints(minHeight: 48), + constraints: const BoxConstraints(minHeight: 48), child: Align( alignment: AlignmentDirectional.centerStart, child: Text.rich( TextSpan( children: [ - WidgetSpan( + const WidgetSpan( child: Padding( padding: EdgeInsetsDirectional.only(end: 8), child: AboutNewsBadge(), @@ -61,7 +61,7 @@ class _AboutUpdateState extends State { child: LinkChip( text: context.l10n.aboutUpdateGithub, url: 'https://github.com/deckerst/aves/releases', - textStyle: TextStyle(fontWeight: FontWeight.bold), + textStyle: const TextStyle(fontWeight: FontWeight.bold), ), alignment: PlaceholderAlignment.middle, ), @@ -70,7 +70,7 @@ class _AboutUpdateState extends State { child: LinkChip( text: context.l10n.aboutUpdateGooglePlay, url: 'https://play.google.com/store/apps/details?id=deckers.thibault.aves', - textStyle: TextStyle(fontWeight: FontWeight.bold), + textStyle: const TextStyle(fontWeight: FontWeight.bold), ), alignment: PlaceholderAlignment.middle, ), @@ -78,11 +78,11 @@ class _AboutUpdateState extends State { ], ), ), - SizedBox(height: 16), + const SizedBox(height: 16), ], ), ), - Divider(), + const Divider(), ], ); }, diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index 67024bdac..df8d6b4ce 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -41,11 +41,11 @@ class _AvesAppState extends State { // observers are not registered when using the same list object with different items // the list itself needs to be reassigned List _navigatorObservers = []; - final EventChannel _contentChangeChannel = EventChannel('deckers.thibault/aves/contentchange'); - final EventChannel _newIntentChannel = EventChannel('deckers.thibault/aves/intent'); + final EventChannel _contentChangeChannel = const EventChannel('deckers.thibault/aves/contentchange'); + final EventChannel _newIntentChannel = const EventChannel('deckers.thibault/aves/intent'); final GlobalKey _navigatorKey = GlobalKey(debugLabel: 'app-navigator'); - Widget getFirstPage({Map? intentData}) => settings.hasAcceptedTerms ? HomePage(intentData: intentData) : WelcomePage(); + Widget getFirstPage({Map? intentData}) => settings.hasAcceptedTerms ? HomePage(intentData: intentData) : const WelcomePage(); @override void initState() { @@ -75,7 +75,7 @@ class _AvesAppState extends State { final home = initialized ? getFirstPage() : Scaffold( - body: snapshot.hasError ? _buildError(snapshot.error!) : SizedBox(), + body: snapshot.hasError ? _buildError(snapshot.error!) : const SizedBox(), ); return Selector( selector: (context, s) => s.locale, @@ -108,12 +108,12 @@ class _AvesAppState extends State { Widget _buildError(Object error) { return Container( alignment: Alignment.center, - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), child: Column( mainAxisSize: MainAxisSize.min, children: [ - Icon(AIcons.error), - SizedBox(height: 16), + const Icon(AIcons.error), + const SizedBox(height: 16), Text(error.toString()), ], ), @@ -151,7 +151,7 @@ class _AvesAppState extends State { FirebaseCrashlytics.instance.log('New intent'); _navigatorKey.currentState!.pushReplacement(DirectMaterialPageRoute( - settings: RouteSettings(name: HomePage.routeName), + settings: const RouteSettings(name: HomePage.routeName), builder: (_) => getFirstPage(intentData: intentData), )); } diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index e33e6ba12..fe3e18bb0 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -137,7 +137,7 @@ class _CollectionAppBarState extends State with SingleTickerPr tooltip = MaterialLocalizations.of(context).backButtonTooltip; } return IconButton( - key: Key('appbar-leading-button'), + key: const Key('appbar-leading-button'), icon: AnimatedIcon( icon: AnimatedIcons.menu_arrow, progress: _browseToSelectAnimation, @@ -197,19 +197,19 @@ class _CollectionAppBarState extends State with SingleTickerPr builder: (context, snapshot) { final canAddShortcuts = snapshot.data ?? false; return PopupMenuButton( - key: Key('appbar-menu-button'), + key: const Key('appbar-menu-button'), itemBuilder: (context) { final isNotEmpty = !collection.isEmpty; final hasSelection = collection.selection.isNotEmpty; return [ PopupMenuItem( - key: Key('menu-sort'), + key: const Key('menu-sort'), value: CollectionAction.sort, child: MenuRow(text: context.l10n.menuActionSort, icon: AIcons.sort), ), if (collection.sortFactor == EntrySortFactor.date) PopupMenuItem( - key: Key('menu-group'), + key: const Key('menu-group'), value: CollectionAction.group, child: MenuRow(text: context.l10n.menuActionGroup, icon: AIcons.group), ), @@ -231,7 +231,7 @@ class _CollectionAppBarState extends State with SingleTickerPr ), ], if (collection.isSelecting) ...[ - PopupMenuDivider(), + const PopupMenuDivider(), PopupMenuItem( value: CollectionAction.copy, enabled: hasSelection, @@ -247,7 +247,7 @@ class _CollectionAppBarState extends State with SingleTickerPr enabled: hasSelection, child: MenuRow(text: context.l10n.collectionActionRefreshMetadata), ), - PopupMenuDivider(), + const PopupMenuDivider(), PopupMenuItem( value: CollectionAction.selectAll, enabled: collection.selection.length < collection.entryCount, @@ -390,7 +390,7 @@ class _CollectionAppBarState extends State with SingleTickerPr Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: StatsPage.routeName), + settings: const RouteSettings(name: StatsPage.routeName), builder: (context) => StatsPage( source: source, parentCollection: collection, diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index 80a52f219..c02505bbd 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -318,7 +318,7 @@ class _CollectionScrollViewState extends State<_CollectionScrollView> { primary: true, // workaround to prevent scrolling the app bar away // when there is no content and we use `SliverFillRemaining` - physics: collection.isEmpty ? NeverScrollableScrollPhysics() : SloppyScrollPhysics(parent: AlwaysScrollableScrollPhysics()), + physics: collection.isEmpty ? const NeverScrollableScrollPhysics() : const SloppyScrollPhysics(parent: AlwaysScrollableScrollPhysics()), cacheExtent: context.select((controller) => controller.effectiveExtentMax), slivers: [ appBar, @@ -327,7 +327,7 @@ class _CollectionScrollViewState extends State<_CollectionScrollView> { hasScrollBody: false, child: _buildEmptyCollectionPlaceholder(collection), ) - : SectionedListSliver(), + : const SectionedListSliver(), BottomPaddingSliver(), ], ); @@ -338,7 +338,7 @@ class _CollectionScrollViewState extends State<_CollectionScrollView> { valueListenable: collection.source.stateNotifier, builder: (context, sourceState, child) { if (sourceState == SourceState.loading) { - return SizedBox.shrink(); + return const SizedBox.shrink(); } if (collection.filters.any((filter) => filter is FavouriteFilter)) { return EmptyContent( diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 09ac0fbba..5bde8c65f 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -46,7 +46,7 @@ class _CollectionPageState extends State { bottom: false, child: ChangeNotifierProvider.value( value: collection, - child: CollectionGrid( + child: const CollectionGrid( key: Key('collection-grid'), ), ), diff --git a/lib/widgets/collection/entry_set_action_delegate.dart b/lib/widgets/collection/entry_set_action_delegate.dart index 5ba7c8572..b92d7aaae 100644 --- a/lib/widgets/collection/entry_set_action_delegate.dart +++ b/lib/widgets/collection/entry_set_action_delegate.dart @@ -81,7 +81,7 @@ class EntrySetActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAware final destinationAlbum = await Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: AlbumPickPage.routeName), + settings: const RouteSettings(name: AlbumPickPage.routeName), builder: (context) => AlbumPickPage(source: source, moveType: moveType), ), ); diff --git a/lib/widgets/collection/filter_bar.dart b/lib/widgets/collection/filter_bar.dart index 02cbb07fd..0e5971f61 100644 --- a/lib/widgets/collection/filter_bar.dart +++ b/lib/widgets/collection/filter_bar.dart @@ -20,7 +20,7 @@ class FilterBar extends StatefulWidget implements PreferredSizeWidget { super(key: key); @override - final Size preferredSize = Size.fromHeight(preferredHeight); + final Size preferredSize = const Size.fromHeight(preferredHeight); @override _FilterBarState createState() => _FilterBarState(); @@ -92,10 +92,10 @@ class _FilterBarState extends State { key: _animatedListKey, initialItemCount: widget.filters.length, scrollDirection: Axis.horizontal, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.only(left: 8), + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.only(left: 8), itemBuilder: (context, index, animation) { - if (index >= widget.filters.length) return SizedBox(); + if (index >= widget.filters.length) return const SizedBox(); return _buildChip(widget.filters.toList()[index]); }, ), @@ -105,7 +105,7 @@ class _FilterBarState extends State { Padding _buildChip(CollectionFilter filter) { return Padding( - padding: EdgeInsets.only(right: 8), + padding: const EdgeInsets.only(right: 8), child: Center( child: AvesFilterChip( key: ValueKey(filter), diff --git a/lib/widgets/collection/grid/headers/album.dart b/lib/widgets/collection/grid/headers/album.dart index 8b0f1a6f6..5f0c7b313 100644 --- a/lib/widgets/collection/grid/headers/album.dart +++ b/lib/widgets/collection/grid/headers/album.dart @@ -38,7 +38,7 @@ class AlbumSectionHeader extends StatelessWidget { leading: albumIcon, title: albumName ?? context.l10n.sectionUnknown, trailing: directory != null && androidFileUtils.isOnRemovableStorage(directory!) - ? Icon( + ? const Icon( AIcons.removableStorage, size: 16, color: Color(0xFF757575), diff --git a/lib/widgets/collection/grid/headers/any.dart b/lib/widgets/collection/grid/headers/any.dart index 741481e49..e245aec61 100644 --- a/lib/widgets/collection/grid/headers/any.dart +++ b/lib/widgets/collection/grid/headers/any.dart @@ -29,7 +29,7 @@ class CollectionSectionHeader extends StatelessWidget { height: height, child: header, ) - : SizedBox.shrink(); + : const SizedBox.shrink(); } Widget? _buildHeader(BuildContext context) { diff --git a/lib/widgets/collection/grid/thumbnail.dart b/lib/widgets/collection/grid/thumbnail.dart index 5329f8cc3..9ae21b681 100644 --- a/lib/widgets/collection/grid/thumbnail.dart +++ b/lib/widgets/collection/grid/thumbnail.dart @@ -66,7 +66,7 @@ class InteractiveThumbnail extends StatelessWidget { Navigator.push( context, TransparentMaterialPageRoute( - settings: RouteSettings(name: EntryViewerPage.routeName), + settings: const RouteSettings(name: EntryViewerPage.routeName), pageBuilder: (c, a, sa) { final viewerCollection = CollectionLens( source: collection.source, diff --git a/lib/widgets/collection/thumbnail/decorated.dart b/lib/widgets/collection/thumbnail/decorated.dart index d3fcfce43..442a067b7 100644 --- a/lib/widgets/collection/thumbnail/decorated.dart +++ b/lib/widgets/collection/thumbnail/decorated.dart @@ -60,10 +60,10 @@ class DecoratedThumbnail extends StatelessWidget { return Container( decoration: BoxDecoration( - border: Border.all( + border: Border.fromBorderSide(BorderSide( color: borderColor, width: borderWidth, - ), + )), ), width: tileExtent, height: tileExtent, diff --git a/lib/widgets/collection/thumbnail/error.dart b/lib/widgets/collection/thumbnail/error.dart index d4a594ce5..7345a4198 100644 --- a/lib/widgets/collection/thumbnail/error.dart +++ b/lib/widgets/collection/thumbnail/error.dart @@ -43,7 +43,7 @@ class _ErrorThumbnailState extends State { builder: (context, snapshot) { Widget child; if (snapshot.connectionState != ConnectionState.done) { - child = SizedBox(); + child = const SizedBox(); } else { final exists = snapshot.data!; child = Tooltip( diff --git a/lib/widgets/collection/thumbnail/overlay.dart b/lib/widgets/collection/thumbnail/overlay.dart index fc2d789ce..4da8d33f3 100644 --- a/lib/widgets/collection/thumbnail/overlay.dart +++ b/lib/widgets/collection/thumbnail/overlay.dart @@ -23,21 +23,21 @@ class ThumbnailEntryOverlay extends StatelessWidget { @override Widget build(BuildContext context) { final children = [ - if (entry.hasGps && context.select((t) => t.showLocation)) GpsIcon(), + if (entry.hasGps && context.select((t) => t.showLocation)) const GpsIcon(), if (entry.isVideo) VideoIcon( entry: entry, ) else if (entry.isAnimated) - AnimatedImageIcon() + const AnimatedImageIcon() else ...[ - if (entry.isRaw && context.select((t) => t.showRaw)) RawIcon(), + if (entry.isRaw && context.select((t) => t.showRaw)) const RawIcon(), if (entry.isMultiPage) MultiPageIcon(entry: entry), - if (entry.isGeotiff) GeotiffIcon(), - if (entry.is360) SphericalImageIcon(), + if (entry.isGeotiff) const GeotiffIcon(), + if (entry.is360) const SphericalImageIcon(), ] ]; - if (children.isEmpty) return SizedBox.shrink(); + if (children.isEmpty) return const SizedBox.shrink(); if (children.length == 1) return children.first; return Column( mainAxisSize: MainAxisSize.min, @@ -74,7 +74,7 @@ class ThumbnailSelectionOverlay extends StatelessWidget { icon: selected ? AIcons.selected : AIcons.unselected, size: context.select((t) => t.iconSize), ) - : SizedBox.shrink(); + : const SizedBox.shrink(); child = AnimatedSwitcher( duration: duration, switchInCurve: Curves.easeOutBack, @@ -94,7 +94,7 @@ class ThumbnailSelectionOverlay extends StatelessWidget { return child; }, ) - : SizedBox.shrink(); + : const SizedBox.shrink(); return AnimatedSwitcher( duration: duration, child: child, @@ -130,10 +130,10 @@ class _ThumbnailHighlightOverlayState extends State { return Sweeper( builder: (context) => Container( decoration: BoxDecoration( - border: Border.all( + border: Border.fromBorderSide(BorderSide( color: Theme.of(context).accentColor, width: context.select((t) => t.highlightBorderWidth), - ), + )), ), ), toggledNotifier: _highlightedNotifier, diff --git a/lib/widgets/common/action_mixins/feedback.dart b/lib/widgets/common/action_mixins/feedback.dart index 044c2dbd7..8d7ab3e53 100644 --- a/lib/widgets/common/action_mixins/feedback.dart +++ b/lib/widgets/common/action_mixins/feedback.dart @@ -103,7 +103,7 @@ class _ReportOverlayState extends State> with SingleTickerPr return FadeTransition( opacity: _animation, child: Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( gradient: RadialGradient( colors: [ Colors.black, diff --git a/lib/widgets/common/app_bar_subtitle.dart b/lib/widgets/common/app_bar_subtitle.dart index 234a3f455..abf2761a5 100644 --- a/lib/widgets/common/app_bar_subtitle.dart +++ b/lib/widgets/common/app_bar_subtitle.dart @@ -34,7 +34,7 @@ class SourceStateAwareAppBarTitle extends StatelessWidget { ), ), child: sourceState == SourceState.ready - ? SizedBox.shrink() + ? const SizedBox.shrink() : SourceStateSubtitle( source: source, ), @@ -70,7 +70,7 @@ class SourceStateSubtitle extends StatelessWidget { } final subtitleStyle = Theme.of(context).textTheme.caption; return subtitle == null - ? SizedBox.shrink() + ? const SizedBox.shrink() : Row( mainAxisSize: MainAxisSize.min, children: [ @@ -78,10 +78,10 @@ class SourceStateSubtitle extends StatelessWidget { StreamBuilder( stream: source.progressStream, builder: (context, snapshot) { - if (snapshot.hasError || !snapshot.hasData) return SizedBox.shrink(); + if (snapshot.hasError || !snapshot.hasData) return const SizedBox.shrink(); final progress = snapshot.data!; return Padding( - padding: EdgeInsetsDirectional.only(start: 8), + padding: const EdgeInsetsDirectional.only(start: 8), child: Text( '${progress.done}/${progress.total}', style: subtitleStyle!.copyWith(color: Colors.white30), diff --git a/lib/widgets/common/app_bar_title.dart b/lib/widgets/common/app_bar_title.dart index e84b84530..5b0c25330 100644 --- a/lib/widgets/common/app_bar_title.dart +++ b/lib/widgets/common/app_bar_title.dart @@ -17,7 +17,7 @@ class InteractiveAppBarTitle extends StatelessWidget { // so that we can also detect taps around the title `Text` child: Container( alignment: AlignmentDirectional.centerStart, - padding: EdgeInsets.symmetric(horizontal: NavigationToolbar.kMiddleSpacing), + padding: const EdgeInsets.symmetric(horizontal: NavigationToolbar.kMiddleSpacing), color: Colors.transparent, height: kToolbarHeight, child: child, diff --git a/lib/widgets/common/basic/draggable_scrollbar.dart b/lib/widgets/common/basic/draggable_scrollbar.dart index 86f60bd42..1f061a425 100644 --- a/lib/widgets/common/basic/draggable_scrollbar.dart +++ b/lib/widgets/common/basic/draggable_scrollbar.dart @@ -89,7 +89,7 @@ class DraggableScrollbar extends StatefulWidget { backgroundColor: backgroundColor, child: labelText, ), - SizedBox(width: 24), + const SizedBox(width: 24), scrollThumb, ], ); @@ -117,11 +117,11 @@ class ScrollLabel extends StatelessWidget { return FadeTransition( opacity: animation, child: Container( - margin: EdgeInsets.only(right: 12.0), + margin: const EdgeInsets.only(right: 12.0), child: Material( elevation: 4.0, color: backgroundColor, - borderRadius: BorderRadius.circular(16), + borderRadius: const BorderRadius.all(Radius.circular(16)), child: child, ), ), @@ -386,8 +386,8 @@ class SlideFadeTransition extends StatelessWidget { builder: (context, child) => animation.value == 0.0 ? Container() : child!, child: SlideTransition( position: Tween( - begin: Offset(0.3, 0.0), - end: Offset(0.0, 0.0), + begin: const Offset(0.3, 0.0), + end: const Offset(0.0, 0.0), ).animate(animation), child: FadeTransition( opacity: animation, diff --git a/lib/widgets/common/basic/insets.dart b/lib/widgets/common/basic/insets.dart index 381101d42..47ef0bdd2 100644 --- a/lib/widgets/common/basic/insets.dart +++ b/lib/widgets/common/basic/insets.dart @@ -17,7 +17,7 @@ class BottomGestureAreaProtector extends StatelessWidget { right: 0, bottom: 0, height: systemGestureBottom, - child: AbsorbPointer(), + child: const AbsorbPointer(), ); }, ); diff --git a/lib/widgets/common/basic/link_chip.dart b/lib/widgets/common/basic/link_chip.dart index 833bddf94..d1437531f 100644 --- a/lib/widgets/common/basic/link_chip.dart +++ b/lib/widgets/common/basic/link_chip.dart @@ -9,7 +9,7 @@ class LinkChip extends StatelessWidget { final Color? color; final TextStyle? textStyle; - static final borderRadius = BorderRadius.circular(8); + static const borderRadius = BorderRadius.all(Radius.circular(8)); const LinkChip({ Key? key, @@ -23,7 +23,7 @@ class LinkChip extends StatelessWidget { @override Widget build(BuildContext context) { return DefaultTextStyle.merge( - style: (textStyle ?? TextStyle()).copyWith(color: color), + style: (textStyle ?? const TextStyle()).copyWith(color: color), child: InkWell( borderRadius: borderRadius, onTap: () async { @@ -32,13 +32,13 @@ class LinkChip extends StatelessWidget { } }, child: Padding( - padding: EdgeInsets.all(8.0), + padding: const EdgeInsets.all(8.0), child: Row( mainAxisSize: MainAxisSize.min, children: [ if (leading != null) ...[ leading!, - SizedBox(width: 8), + const SizedBox(width: 8), ], Flexible( child: Text( @@ -48,7 +48,7 @@ class LinkChip extends StatelessWidget { maxLines: 1, ), ), - SizedBox(width: 8), + const SizedBox(width: 8), Builder( builder: (context) => Icon( AIcons.openOutside, diff --git a/lib/widgets/common/basic/menu_row.dart b/lib/widgets/common/basic/menu_row.dart index 9279f273c..81492121a 100644 --- a/lib/widgets/common/basic/menu_row.dart +++ b/lib/widgets/common/basic/menu_row.dart @@ -24,11 +24,11 @@ class MenuRow extends StatelessWidget { opacity: checked! ? 1 : 0, child: Icon(AIcons.checked, size: iconSize), ), - SizedBox(width: 8), + const SizedBox(width: 8), ], if (icon != null) ...[ Icon(icon, size: iconSize), - SizedBox(width: 8), + const SizedBox(width: 8), ], Expanded(child: Text(text)), ], diff --git a/lib/widgets/common/basic/multi_cross_fader.dart b/lib/widgets/common/basic/multi_cross_fader.dart index 227740b95..5736bf622 100644 --- a/lib/widgets/common/basic/multi_cross_fader.dart +++ b/lib/widgets/common/basic/multi_cross_fader.dart @@ -26,7 +26,7 @@ class _MultiCrossFaderState extends State { void initState() { super.initState(); _first = widget.child; - _second = SizedBox(); + _second = const SizedBox(); } @override diff --git a/lib/widgets/common/basic/query_bar.dart b/lib/widgets/common/basic/query_bar.dart index 8d7f5a811..2a35774b5 100644 --- a/lib/widgets/common/basic/query_bar.dart +++ b/lib/widgets/common/basic/query_bar.dart @@ -30,7 +30,7 @@ class _QueryBarState extends State { @override Widget build(BuildContext context) { final clearButton = IconButton( - icon: Icon(AIcons.clear), + icon: const Icon(AIcons.clear), onPressed: () { _controller.clear(); filterNotifier.value = ''; @@ -45,7 +45,7 @@ class _QueryBarState extends State { child: TextField( controller: _controller, decoration: InputDecoration( - icon: Padding( + icon: const Padding( padding: EdgeInsetsDirectional.only(start: 16), child: Icon(AIcons.search), ), @@ -57,7 +57,7 @@ class _QueryBarState extends State { ), ), ConstrainedBox( - constraints: BoxConstraints(minWidth: 16), + constraints: const BoxConstraints(minWidth: 16), child: ValueListenableBuilder( valueListenable: _controller, builder: (context, value, child) => AnimatedSwitcher( @@ -70,7 +70,7 @@ class _QueryBarState extends State { child: child, ), ), - child: value.text.isNotEmpty ? clearButton : SizedBox.shrink(), + child: value.text.isNotEmpty ? clearButton : const SizedBox.shrink(), ), ), ) diff --git a/lib/widgets/common/fx/blurred.dart b/lib/widgets/common/fx/blurred.dart index de0c11bf4..c995a4597 100644 --- a/lib/widgets/common/fx/blurred.dart +++ b/lib/widgets/common/fx/blurred.dart @@ -40,7 +40,7 @@ class BlurredRRect extends StatelessWidget { @override Widget build(BuildContext context) { return ClipRRect( - borderRadius: BorderRadius.circular(borderRadius), + borderRadius: BorderRadius.all(Radius.circular(borderRadius)), child: BackdropFilter( filter: _filter, child: child, diff --git a/lib/widgets/common/grid/draggable_thumb_label.dart b/lib/widgets/common/grid/draggable_thumb_label.dart index 43404a8ce..d82161d3a 100644 --- a/lib/widgets/common/grid/draggable_thumb_label.dart +++ b/lib/widgets/common/grid/draggable_thumb_label.dart @@ -17,7 +17,7 @@ class DraggableThumbLabel extends StatelessWidget { Widget build(BuildContext context) { final sll = context.read>(); final sectionLayout = sll.getSectionAt(offsetY); - if (sectionLayout == null) return SizedBox(); + if (sectionLayout == null) return const SizedBox(); final section = sll.sections[sectionLayout.sectionKey]!; final dy = offsetY - (sectionLayout.minOffset + sectionLayout.headerExtent); @@ -25,12 +25,12 @@ class DraggableThumbLabel extends StatelessWidget { final item = section[itemIndex]; final lines = lineBuilder(context, item); - if (lines.isEmpty) return SizedBox(); + if (lines.isEmpty) return const SizedBox(); return ConstrainedBox( - constraints: BoxConstraints(maxWidth: 140), + constraints: const BoxConstraints(maxWidth: 140), child: Padding( - padding: EdgeInsets.symmetric(vertical: 4, horizontal: 8), + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 8), child: lines.length > 1 ? Column( mainAxisSize: MainAxisSize.min, @@ -44,7 +44,7 @@ class DraggableThumbLabel extends StatelessWidget { Widget _buildText(String text) => Text( text, - style: TextStyle( + style: const TextStyle( color: Colors.black, ), softWrap: false, diff --git a/lib/widgets/common/grid/header.dart b/lib/widgets/common/grid/header.dart index de56dc950..37ac83dd4 100644 --- a/lib/widgets/common/grid/header.dart +++ b/lib/widgets/common/grid/header.dart @@ -35,7 +35,7 @@ class SectionHeader extends StatelessWidget { return Container( alignment: AlignmentDirectional.centerStart, padding: padding, - constraints: BoxConstraints(minHeight: leadingDimension), + constraints: const BoxConstraints(minHeight: leadingDimension), child: GestureDetector( onTap: selectable ? () => _toggleSectionSelection(context) : null, child: Text.rich( @@ -158,12 +158,12 @@ class _SectionSelectableLeading extends StatelessWidget { ), child: IconButton( iconSize: 26, - padding: EdgeInsets.only(top: 1), + padding: const EdgeInsets.only(top: 1), alignment: AlignmentDirectional.topStart, icon: Icon(selected ? AIcons.selected : AIcons.unselected), onPressed: onPressed, tooltip: selected ? context.l10n.collectionDeselectSectionTooltip : context.l10n.collectionSelectSectionTooltip, - constraints: BoxConstraints( + constraints: const BoxConstraints( minHeight: leadingDimension, minWidth: leadingDimension, ), @@ -208,5 +208,5 @@ class _SectionSelectableLeading extends StatelessWidget { ); } - Widget _buildBrowsing(BuildContext context) => browsingBuilder?.call(context) ?? SizedBox(height: leadingDimension); + Widget _buildBrowsing(BuildContext context) => browsingBuilder?.call(context) ?? const SizedBox(height: leadingDimension); } diff --git a/lib/widgets/common/grid/section_layout.dart b/lib/widgets/common/grid/section_layout.dart index 3c7c7d290..c4a9419ee 100644 --- a/lib/widgets/common/grid/section_layout.dart +++ b/lib/widgets/common/grid/section_layout.dart @@ -106,7 +106,7 @@ abstract class SectionedListLayoutProvider extends StatelessWidget { bool animate, ) { if (sectionChildIndex == 0) { - final header = headerExtent > 0 ? buildHeader(context, sectionKey, headerExtent) : SizedBox.shrink(); + final header = headerExtent > 0 ? buildHeader(context, sectionKey, headerExtent) : const SizedBox.shrink(); return animate ? _buildAnimation(sectionGridIndex, header) : header; } sectionChildIndex--; diff --git a/lib/widgets/common/grid/sliver.dart b/lib/widgets/common/grid/sliver.dart index e5996c1d5..d12ccc5ed 100644 --- a/lib/widgets/common/grid/sliver.dart +++ b/lib/widgets/common/grid/sliver.dart @@ -26,7 +26,7 @@ class SectionedListSliver extends StatelessWidget { (context, index) { if (index >= childCount) return null; final sectionLayout = sectionLayouts.firstWhereOrNull((section) => section.hasChild(index)); - return sectionLayout?.builder(context, index) ?? SizedBox.shrink(); + return sectionLayout?.builder(context, index) ?? const SizedBox.shrink(); }, childCount: childCount, addAutomaticKeepAlives: false, diff --git a/lib/widgets/common/identity/aves_expansion_tile.dart b/lib/widgets/common/identity/aves_expansion_tile.dart index 4845a0349..09f6352c9 100644 --- a/lib/widgets/common/identity/aves_expansion_tile.dart +++ b/lib/widgets/common/identity/aves_expansion_tile.dart @@ -35,7 +35,7 @@ class AvesExpansionTile extends StatelessWidget { titleChild = Row( children: [ leading!, - SizedBox(width: 8), + const SizedBox(width: 8), Expanded(child: titleChild), ], ); @@ -52,15 +52,15 @@ class AvesExpansionTile extends StatelessWidget { title: titleChild, expandable: enabled, initiallyExpanded: initiallyExpanded, - finalPadding: EdgeInsets.symmetric(vertical: 6.0), + finalPadding: const EdgeInsets.symmetric(vertical: 6.0), baseColor: Colors.grey.shade900, expandedColor: Colors.grey[850], shadowColor: Theme.of(context).shadowColor, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Divider(thickness: 1, height: 1), - SizedBox(height: 4), + const Divider(thickness: 1, height: 1), + const SizedBox(height: 4), if (enabled) ...children, ], ), diff --git a/lib/widgets/common/identity/aves_filter_chip.dart b/lib/widgets/common/identity/aves_filter_chip.dart index 5eb06e363..24831d348 100644 --- a/lib/widgets/common/identity/aves_filter_chip.dart +++ b/lib/widgets/common/identity/aves_filter_chip.dart @@ -65,7 +65,7 @@ class AvesFilterChip extends StatefulWidget { FocusManager.instance.primaryFocus?.unfocus(); final overlay = Overlay.of(context)!.context.findRenderObject() as RenderBox; - final touchArea = Size(40, 40); + const touchArea = Size(40, 40); final selectedAction = await showMenu( context: context, position: RelativeRect.fromRect(tapPosition & touchArea, Offset.zero & overlay.size), @@ -186,17 +186,17 @@ class _AvesFilterChipState extends State { color: Colors.black54, child: DefaultTextStyle( style: Theme.of(context).textTheme.bodyText2!.copyWith( - shadows: [Constants.embossShadow], - ), + shadows: Constants.embossShadows, + ), child: content, ), ), ); } - final borderRadius = widget.borderRadius ?? BorderRadius.circular(AvesFilterChip.defaultRadius); + final borderRadius = widget.borderRadius ?? const BorderRadius.all(Radius.circular(AvesFilterChip.defaultRadius)); Widget chip = Container( - constraints: BoxConstraints( + constraints: const BoxConstraints( minWidth: AvesFilterChip.minChipWidth, maxWidth: AvesFilterChip.maxChipWidth, minHeight: AvesFilterChip.minChipHeight, @@ -237,15 +237,15 @@ class _AvesFilterChipState extends State { } return DecoratedBox( decoration: BoxDecoration( - border: Border.all( + border: Border.fromBorderSide(BorderSide( color: _outlineColor, width: AvesFilterChip.outlineWidth, - ), + )), borderRadius: borderRadius, ), position: DecorationPosition.foreground, child: Padding( - padding: EdgeInsets.symmetric(vertical: 8), + padding: const EdgeInsets.symmetric(vertical: 8), child: content, ), ); @@ -263,7 +263,7 @@ class _AvesFilterChipState extends State { tag: filter, transitionOnUserGestures: true, child: DefaultTextStyle( - style: TextStyle(), + style: const TextStyle(), child: chip, ), ); diff --git a/lib/widgets/common/identity/aves_icons.dart b/lib/widgets/common/identity/aves_icons.dart index de3c38e82..433764ab3 100644 --- a/lib/widgets/common/identity/aves_icons.dart +++ b/lib/widgets/common/identity/aves_icons.dart @@ -150,11 +150,11 @@ class OverlayIcon extends StatelessWidget { ); return Container( - margin: EdgeInsets.all(1), + margin: const EdgeInsets.all(1), padding: text != null ? EdgeInsets.only(right: size / 4) : null, decoration: BoxDecoration( - color: Color(0xBB000000), - borderRadius: BorderRadius.circular(size), + color: const Color(0xBB000000), + borderRadius: BorderRadius.all(Radius.circular(size)), ), child: text == null ? iconBox @@ -163,7 +163,7 @@ class OverlayIcon extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.center, children: [ iconBox, - SizedBox(width: 2), + const SizedBox(width: 2), Text(text!), ], ), @@ -187,7 +187,7 @@ class IconUtils { data: context.read().copyWith(textScaleFactor: 1.0), child: DecoratedIcon( icon, - shadows: [Constants.embossShadow], + shadows: Constants.embossShadows, size: size, ), ) diff --git a/lib/widgets/common/identity/empty.dart b/lib/widgets/common/identity/empty.dart index a93f18ede..27e5ac597 100644 --- a/lib/widgets/common/identity/empty.dart +++ b/lib/widgets/common/identity/empty.dart @@ -25,11 +25,11 @@ class EmptyContent extends StatelessWidget { size: 64, color: color, ), - SizedBox(height: 16) + const SizedBox(height: 16) ], Text( text, - style: TextStyle( + style: const TextStyle( color: color, fontSize: 22, ), diff --git a/lib/widgets/common/identity/highlight_title.dart b/lib/widgets/common/identity/highlight_title.dart index 0a21390c0..8d9c95a93 100644 --- a/lib/widgets/common/identity/highlight_title.dart +++ b/lib/widgets/common/identity/highlight_title.dart @@ -25,7 +25,7 @@ class HighlightTitle extends StatelessWidget { @override Widget build(BuildContext context) { final style = TextStyle( - shadows: [ + shadows: const [ Shadow( color: Colors.black, offset: Offset(1, 1), @@ -34,7 +34,7 @@ class HighlightTitle extends StatelessWidget { ], fontSize: fontSize, letterSpacing: 1.0, - fontFeatures: [FontFeature.enable('smcp')], + fontFeatures: const [FontFeature.enable('smcp')], ); return Align( @@ -45,7 +45,7 @@ class HighlightTitle extends StatelessWidget { color: enabled ? color ?? stringToColor(title) : disabledColor, ) : null, - margin: EdgeInsets.symmetric(vertical: 4.0), + margin: const EdgeInsets.symmetric(vertical: 4.0), child: selectable ? SelectableText( title, diff --git a/lib/widgets/common/identity/scroll_thumb.dart b/lib/widgets/common/identity/scroll_thumb.dart index ef937c022..b79cc1fb7 100644 --- a/lib/widgets/common/identity/scroll_thumb.dart +++ b/lib/widgets/common/identity/scroll_thumb.dart @@ -10,20 +10,20 @@ ScrollThumbBuilder avesScrollThumbBuilder({ required Color backgroundColor, }) { final scrollThumb = Container( - decoration: BoxDecoration( + decoration: const BoxDecoration( color: Colors.black26, - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.all(Radius.circular(12)), ), height: height, - margin: EdgeInsets.only(right: .5), - padding: EdgeInsets.all(2), + margin: const EdgeInsets.only(right: .5), + padding: const EdgeInsets.all(2), child: ClipPath( clipper: ArrowClipper(), child: Container( width: 20.0, decoration: BoxDecoration( color: backgroundColor, - borderRadius: BorderRadius.circular(12), + borderRadius: const BorderRadius.all(Radius.circular(12)), ), ), ), diff --git a/lib/widgets/common/magnifier/controller/controller.dart b/lib/widgets/common/magnifier/controller/controller.dart index 84483e43c..27513bb9a 100644 --- a/lib/widgets/common/magnifier/controller/controller.dart +++ b/lib/widgets/common/magnifier/controller/controller.dart @@ -28,7 +28,7 @@ class MagnifierController { _currentState = initial; _setState(initial); - final _initialScaleState = ScaleStateChange(state: ScaleState.initial, source: ChangeSource.internal); + const _initialScaleState = ScaleStateChange(state: ScaleState.initial, source: ChangeSource.internal); previousScaleState = _initialScaleState; _currentScaleState = _initialScaleState; _setScaleState(_initialScaleState); diff --git a/lib/widgets/common/magnifier/core/core.dart b/lib/widgets/common/magnifier/core/core.dart index f71cd572e..7ea5035e3 100644 --- a/lib/widgets/common/magnifier/core/core.dart +++ b/lib/widgets/common/magnifier/core/core.dart @@ -302,7 +302,7 @@ class _CenterWithOriginalSizeDelegate extends SingleChildLayoutDelegate { @override BoxConstraints getConstraintsForChild(BoxConstraints constraints) { - return applyScale ? BoxConstraints.tight(subjectSize) : BoxConstraints(); + return applyScale ? BoxConstraints.tight(subjectSize) : const BoxConstraints(); } @override diff --git a/lib/widgets/common/magnifier/pan/corner_hit_detector.dart b/lib/widgets/common/magnifier/pan/corner_hit_detector.dart index 5e7a15a06..604666b7e 100644 --- a/lib/widgets/common/magnifier/pan/corner_hit_detector.dart +++ b/lib/widgets/common/magnifier/pan/corner_hit_detector.dart @@ -14,7 +14,7 @@ mixin CornerHitDetector on MagnifierControllerDelegate { final childWidth = scaleBoundaries.childSize.width * scale!; final viewportWidth = scaleBoundaries.viewportSize.width; if (viewportWidth + precisionErrorTolerance >= childWidth) { - return _CornerHit(true, true); + return const _CornerHit(true, true); } final x = -position.dx; final cornersX = this.cornersX(); @@ -25,7 +25,7 @@ mixin CornerHitDetector on MagnifierControllerDelegate { final childHeight = scaleBoundaries.childSize.height * scale!; final viewportHeight = scaleBoundaries.viewportSize.height; if (viewportHeight + precisionErrorTolerance >= childHeight) { - return _CornerHit(true, true); + return const _CornerHit(true, true); } final y = -position.dy; final cornersY = this.cornersY(); diff --git a/lib/widgets/common/scaling.dart b/lib/widgets/common/scaling.dart index 226dbaef6..9a0f48acc 100644 --- a/lib/widgets/common/scaling.dart +++ b/lib/widgets/common/scaling.dart @@ -206,7 +206,7 @@ class _ScaleOverlayState extends State { ], ), ) - : BoxDecoration( + : const BoxDecoration( // provide dummy gradient to lerp to the other one during animation gradient: RadialGradient( colors: [ @@ -237,7 +237,7 @@ class _ScaleOverlayState extends State { left: clampedCenter.dx - extent / 2, top: clampedCenter.dy - extent / 2, child: DefaultTextStyle( - style: TextStyle(), + style: const TextStyle(), child: child, ), ), diff --git a/lib/widgets/debug/android_apps.dart b/lib/widgets/debug/android_apps.dart index 01ef8f608..fa39ddb39 100644 --- a/lib/widgets/debug/android_apps.dart +++ b/lib/widgets/debug/android_apps.dart @@ -30,15 +30,15 @@ class _DebugAndroidAppSectionState extends State with Au title: 'Android Apps', children: [ Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: FutureBuilder>( future: _loader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final packages = snapshot.data!.toList()..sort((a, b) => compareAsciiUpperCase(a.packageName, b.packageName)); final enabledTheme = IconTheme.of(context); - final disabledTheme = enabledTheme.merge(IconThemeData(opacity: .2)); + final disabledTheme = enabledTheme.merge(const IconThemeData(opacity: .2)); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: packages.map((package) { @@ -64,7 +64,7 @@ class _DebugAndroidAppSectionState extends State with Au alignment: PlaceholderAlignment.middle, child: IconTheme( data: package.categoryLauncher ? enabledTheme : disabledTheme, - child: Icon( + child: const Icon( Icons.launch_outlined, size: iconSize, ), @@ -74,7 +74,7 @@ class _DebugAndroidAppSectionState extends State with Au alignment: PlaceholderAlignment.middle, child: IconTheme( data: package.isSystem ? enabledTheme : disabledTheme, - child: Icon( + child: const Icon( Icons.android, size: iconSize, ), diff --git a/lib/widgets/debug/android_dirs.dart b/lib/widgets/debug/android_dirs.dart index c5a1f9eb1..98e49f0cc 100644 --- a/lib/widgets/debug/android_dirs.dart +++ b/lib/widgets/debug/android_dirs.dart @@ -27,12 +27,12 @@ class _DebugAndroidDirSectionState extends State with Au title: 'Android Dirs', children: [ Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: FutureBuilder( future: _loader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = SplayTreeMap.of(snapshot.data!.map((k, v) => MapEntry(k.toString(), v?.toString() ?? 'null'))); return InfoRowGroup(data); }, diff --git a/lib/widgets/debug/android_env.dart b/lib/widgets/debug/android_env.dart index 164cbe3a6..a7893c609 100644 --- a/lib/widgets/debug/android_env.dart +++ b/lib/widgets/debug/android_env.dart @@ -27,12 +27,12 @@ class _DebugAndroidEnvironmentSectionState extends State( future: _loader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = SplayTreeMap.of(snapshot.data!.map((k, v) => MapEntry(k.toString(), v?.toString() ?? 'null'))); return InfoRowGroup(data); }, diff --git a/lib/widgets/debug/app_debug_page.dart b/lib/widgets/debug/app_debug_page.dart index 29c198a70..ce6a93b87 100644 --- a/lib/widgets/debug/app_debug_page.dart +++ b/lib/widgets/debug/app_debug_page.dart @@ -35,11 +35,11 @@ class _AppDebugPageState extends State { return MediaQueryDataProvider( child: Scaffold( appBar: AppBar( - title: Text('Debug'), + title: const Text('Debug'), ), body: SafeArea( child: ListView( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), children: [ _buildGeneralTabView(), DebugAndroidAppSection(), @@ -65,7 +65,7 @@ class _AppDebugPageState extends State { return AvesExpansionTile( title: 'General', children: [ - Padding( + const Padding( padding: EdgeInsets.all(8), child: Text('Time dilation'), ), @@ -91,11 +91,11 @@ class _AppDebugPageState extends State { } setState(() {}); }, - title: Text('Show tasks overlay'), + title: const Text('Show tasks overlay'), ), - Divider(), + const Divider(), Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: InfoRowGroup( { 'All entries': '${source.allEntries.length}', diff --git a/lib/widgets/debug/cache.dart b/lib/widgets/debug/cache.dart index bad822e0a..8ab1cf38b 100644 --- a/lib/widgets/debug/cache.dart +++ b/lib/widgets/debug/cache.dart @@ -18,7 +18,7 @@ class _DebugCacheSectionState extends State with AutomaticKee title: 'Cache', children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric(horizontal: 8), child: Column( children: [ Row( @@ -26,14 +26,14 @@ class _DebugCacheSectionState extends State with AutomaticKee Expanded( child: Text('Image cache:\n\t${imageCache!.currentSize}/${imageCache!.maximumSize} items\n\t${formatFilesize(imageCache!.currentSizeBytes)}/${formatFilesize(imageCache!.maximumSizeBytes)}'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () { imageCache!.clear(); setState(() {}); }, - child: Text('Clear'), + child: const Text('Clear'), ), ], ), @@ -42,26 +42,26 @@ class _DebugCacheSectionState extends State with AutomaticKee Expanded( child: Text('SVG cache: ${PictureProvider.cache.count} items'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () { PictureProvider.cache.clear(); setState(() {}); }, - child: Text('Clear'), + child: const Text('Clear'), ), ], ), Row( children: [ - Expanded( + const Expanded( child: Text('Glide disk cache: ?'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: imageFileService.clearSizedThumbnailDiskCache, - child: Text('Clear'), + child: const Text('Clear'), ), ], ), diff --git a/lib/widgets/debug/database.dart b/lib/widgets/debug/database.dart index 119502afb..ef7e25d89 100644 --- a/lib/widgets/debug/database.dart +++ b/lib/widgets/debug/database.dart @@ -35,7 +35,7 @@ class _DebugAppDatabaseSectionState extends State with title: 'Database', children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric(horizontal: 8), child: Column( children: [ FutureBuilder( @@ -43,17 +43,17 @@ class _DebugAppDatabaseSectionState extends State with builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('DB file size: ${formatFilesize(snapshot.data!)}'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.reset().then((_) => _startDbReport()), - child: Text('Reset'), + child: const Text('Reset'), ), ], ); @@ -64,17 +64,17 @@ class _DebugAppDatabaseSectionState extends State with builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('entry rows: ${snapshot.data!.length}'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearEntries().then((_) => _startDbReport()), - child: Text('Clear'), + child: const Text('Clear'), ), ], ); @@ -85,17 +85,17 @@ class _DebugAppDatabaseSectionState extends State with builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('date rows: ${snapshot.data!.length}'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearDates().then((_) => _startDbReport()), - child: Text('Clear'), + child: const Text('Clear'), ), ], ); @@ -106,17 +106,17 @@ class _DebugAppDatabaseSectionState extends State with builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('metadata rows: ${snapshot.data!.length}'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearMetadataEntries().then((_) => _startDbReport()), - child: Text('Clear'), + child: const Text('Clear'), ), ], ); @@ -127,17 +127,17 @@ class _DebugAppDatabaseSectionState extends State with builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('address rows: ${snapshot.data!.length}'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => metadataDb.clearAddresses().then((_) => _startDbReport()), - child: Text('Clear'), + child: const Text('Clear'), ), ], ); @@ -148,17 +148,17 @@ class _DebugAppDatabaseSectionState extends State with builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('favourite rows: ${snapshot.data!.length} (${favourites.count} in memory)'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => favourites.clear().then((_) => _startDbReport()), - child: Text('Clear'), + child: const Text('Clear'), ), ], ); @@ -169,17 +169,17 @@ class _DebugAppDatabaseSectionState extends State with builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Row( children: [ Expanded( child: Text('cover rows: ${snapshot.data!.length} (${covers.count} in memory)'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => covers.clear().then((_) => _startDbReport()), - child: Text('Clear'), + child: const Text('Clear'), ), ], ); diff --git a/lib/widgets/debug/firebase.dart b/lib/widgets/debug/firebase.dart index c1069f07e..c63291a74 100644 --- a/lib/widgets/debug/firebase.dart +++ b/lib/widgets/debug/firebase.dart @@ -12,26 +12,26 @@ class DebugFirebaseSection extends StatelessWidget { title: 'Firebase', children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric(horizontal: 8), child: Row( children: [ ElevatedButton( onPressed: FirebaseCrashlytics.instance.crash, - child: Text('Crash'), + child: const Text('Crash'), ), - SizedBox(width: 8), + const SizedBox(width: 8), ElevatedButton( onPressed: () => FirebaseAnalytics().logEvent( name: 'debug_test', parameters: {'time': DateTime.now().toIso8601String()}, ), - child: Text('Send event'), + child: const Text('Send event'), ), ], ), ), Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: InfoRowGroup({ 'Firebase data collection enabled': '${Firebase.app().isAutomaticDataCollectionEnabled}', 'Crashlytics collection enabled': '${FirebaseCrashlytics.instance.isCrashlyticsCollectionEnabled}', diff --git a/lib/widgets/debug/overlay.dart b/lib/widgets/debug/overlay.dart index 0dd0b5eaa..8fcae7b2c 100644 --- a/lib/widgets/debug/overlay.dart +++ b/lib/widgets/debug/overlay.dart @@ -6,17 +6,17 @@ class DebugTaskQueueOverlay extends StatelessWidget { Widget build(BuildContext context) { return IgnorePointer( child: DefaultTextStyle( - style: TextStyle(), + style: const TextStyle(), child: Align( alignment: AlignmentDirectional.bottomStart, child: SafeArea( child: Container( color: Colors.indigo.shade900.withAlpha(0xCC), - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), child: StreamBuilder( stream: servicePolicy.queueStream, builder: (context, snapshot) { - if (snapshot.hasError) return SizedBox.shrink(); + if (snapshot.hasError) return const SizedBox.shrink(); final queuedEntries = >[]; if (snapshot.hasData) { final state = snapshot.data!; diff --git a/lib/widgets/debug/settings.dart b/lib/widgets/debug/settings.dart index aae0e036b..3878a47bd 100644 --- a/lib/widgets/debug/settings.dart +++ b/lib/widgets/debug/settings.dart @@ -18,19 +18,19 @@ class DebugSettingsSection extends StatelessWidget { title: 'Settings', children: [ Padding( - padding: EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric(horizontal: 8), child: ElevatedButton( onPressed: () => settings.reset(), - child: Text('Reset'), + child: const Text('Reset'), ), ), SwitchListTile( value: settings.hasAcceptedTerms, onChanged: (v) => settings.hasAcceptedTerms = v, - title: Text('hasAcceptedTerms'), + title: const Text('hasAcceptedTerms'), ), Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: InfoRowGroup({ 'tileExtent - Collection': '${settings.getTileExtent(CollectionPage.routeName)}', 'tileExtent - Albums': '${settings.getTileExtent(AlbumListPage.routeName)}', diff --git a/lib/widgets/debug/storage.dart b/lib/widgets/debug/storage.dart index e7227b8fd..d4b9ffb12 100644 --- a/lib/widgets/debug/storage.dart +++ b/lib/widgets/debug/storage.dart @@ -33,11 +33,11 @@ class _DebugStorageSectionState extends State with Automati final freeSpace = _freeSpaceByVolume[v.path]; return [ Padding( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), child: Text(v.path), ), Padding( - padding: EdgeInsets.symmetric(horizontal: 8), + padding: const EdgeInsets.symmetric(horizontal: 8), child: InfoRowGroup({ 'description': '${v.getDescription(context)}', 'isPrimary': '${v.isPrimary}', @@ -46,7 +46,7 @@ class _DebugStorageSectionState extends State with Automati if (freeSpace != null) 'freeSpace': formatFilesize(freeSpace), }), ), - Divider(), + const Divider(), ]; }) ], diff --git a/lib/widgets/dialogs/add_shortcut_dialog.dart b/lib/widgets/dialogs/add_shortcut_dialog.dart index 9092b695d..82b9c1900 100644 --- a/lib/widgets/dialogs/add_shortcut_dialog.dart +++ b/lib/widgets/dialogs/add_shortcut_dialog.dart @@ -67,11 +67,11 @@ class _AddShortcutDialogState extends State { if (_coverEntry != null) Container( alignment: Alignment.center, - padding: EdgeInsets.only(top: 16), + padding: const EdgeInsets.only(top: 16), child: _buildCover(_coverEntry!, extent), ), Padding( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 24), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 24), child: TextField( controller: _nameController, decoration: InputDecoration( @@ -109,7 +109,7 @@ class _AddShortcutDialogState extends State { return GestureDetector( onTap: _pickEntry, child: ClipRRect( - borderRadius: BorderRadius.circular(32), + borderRadius: const BorderRadius.all(Radius.circular(32)), child: SizedBox( width: extent, height: extent, @@ -131,7 +131,7 @@ class _AddShortcutDialogState extends State { final entry = await Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: ItemPickDialog.routeName), + settings: const RouteSettings(name: ItemPickDialog.routeName), builder: (context) => ItemPickDialog( CollectionLens( source: collection.source, diff --git a/lib/widgets/dialogs/aves_dialog.dart b/lib/widgets/dialogs/aves_dialog.dart index 0626887ea..c47c4258a 100644 --- a/lib/widgets/dialogs/aves_dialog.dart +++ b/lib/widgets/dialogs/aves_dialog.dart @@ -20,7 +20,7 @@ class AvesDialog extends AlertDialog { title: title != null ? Padding( // padding to avoid transparent border overlapping - padding: EdgeInsets.symmetric(horizontal: borderWidth), + padding: const EdgeInsets.symmetric(horizontal: borderWidth), child: DialogTitle(title: title), ) : null, @@ -32,7 +32,7 @@ class AvesDialog extends AlertDialog { content: scrollableContent != null ? Container( // padding to avoid transparent border overlapping - padding: EdgeInsets.symmetric(horizontal: borderWidth), + padding: const EdgeInsets.symmetric(horizontal: borderWidth), // workaround because the dialog tries // to size itself to the content intrinsic size, // but the `ListView` viewport does not have one @@ -51,12 +51,12 @@ class AvesDialog extends AlertDialog { ), ) : content, - contentPadding: scrollableContent != null ? EdgeInsets.zero : EdgeInsets.fromLTRB(24, 20, 24, 0), + contentPadding: scrollableContent != null ? EdgeInsets.zero : const EdgeInsets.fromLTRB(24, 20, 24, 0), actions: actions, - actionsPadding: EdgeInsets.symmetric(horizontal: 8), + actionsPadding: const EdgeInsets.symmetric(horizontal: 8), shape: RoundedRectangleBorder( side: Divider.createBorderSide(context, width: borderWidth), - borderRadius: BorderRadius.circular(24), + borderRadius: const BorderRadius.all(Radius.circular(24)), ), ); } @@ -78,7 +78,7 @@ class DialogTitle extends StatelessWidget { ), child: Text( title, - style: TextStyle( + style: const TextStyle( fontWeight: FontWeight.normal, fontFeatures: [FontFeature.enable('smcp')], ), diff --git a/lib/widgets/dialogs/cover_selection_dialog.dart b/lib/widgets/dialogs/cover_selection_dialog.dart index 102011dac..eefa7f90d 100644 --- a/lib/widgets/dialogs/cover_selection_dialog.dart +++ b/lib/widgets/dialogs/cover_selection_dialog.dart @@ -74,11 +74,11 @@ class _CoverSelectionDialogState extends State { title: isCustom ? Row(children: [ title, - Spacer(), + const Spacer(), IconButton( onPressed: _isCustom ? _pickEntry : null, tooltip: 'Change', - icon: Icon(AIcons.setCover), + icon: const Icon(AIcons.setCover), ), ]) : title, @@ -87,7 +87,7 @@ class _CoverSelectionDialogState extends State { ), Container( alignment: Alignment.center, - padding: EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.only(bottom: 16), child: DecoratedFilterChip( filter: filter, extent: extent, @@ -116,7 +116,7 @@ class _CoverSelectionDialogState extends State { final entry = await Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: ItemPickDialog.routeName), + settings: const RouteSettings(name: ItemPickDialog.routeName), builder: (context) => ItemPickDialog( CollectionLens( source: context.read(), diff --git a/lib/widgets/dialogs/create_album_dialog.dart b/lib/widgets/dialogs/create_album_dialog.dart index 71077fb5c..c66a98d53 100644 --- a/lib/widgets/dialogs/create_album_dialog.dart +++ b/lib/widgets/dialogs/create_album_dialog.dart @@ -50,12 +50,12 @@ class _CreateAlbumDialogState extends State { final otherVolumes = (byPrimary[false] ?? [])..sort(compare); volumeTiles.addAll([ Padding( - padding: AvesDialog.contentHorizontalPadding + EdgeInsets.only(top: 20), + padding: AvesDialog.contentHorizontalPadding + const EdgeInsets.only(top: 20), child: Text(context.l10n.newAlbumDialogStorageLabel), ), ...primaryVolumes.map((volume) => _buildVolumeTile(context, volume)), ...otherVolumes.map((volume) => _buildVolumeTile(context, volume)), - SizedBox(height: 8), + const SizedBox(height: 8), ]); } @@ -66,7 +66,7 @@ class _CreateAlbumDialogState extends State { scrollableContent: [ ...volumeTiles, Padding( - padding: AvesDialog.contentHorizontalPadding + EdgeInsets.only(bottom: 8), + padding: AvesDialog.contentHorizontalPadding + const EdgeInsets.only(bottom: 8), child: ValueListenableBuilder( valueListenable: _existsNotifier, builder: (context, exists, child) { diff --git a/lib/widgets/dialogs/item_pick_dialog.dart b/lib/widgets/dialogs/item_pick_dialog.dart index 013f14fe4..03cf7c8f0 100644 --- a/lib/widgets/dialogs/item_pick_dialog.dart +++ b/lib/widgets/dialogs/item_pick_dialog.dart @@ -38,7 +38,7 @@ class _ItemPickDialogState extends State { bottom: false, child: ChangeNotifierProvider.value( value: collection, - child: CollectionGrid( + child: const CollectionGrid( settingsRouteKey: CollectionPage.routeName, ), ), diff --git a/lib/widgets/drawer/album_tile.dart b/lib/widgets/drawer/album_tile.dart index e47e0b1b7..d9e1f5830 100644 --- a/lib/widgets/drawer/album_tile.dart +++ b/lib/widgets/drawer/album_tile.dart @@ -23,7 +23,7 @@ class AlbumTile extends StatelessWidget { ), title: displayName, trailing: androidFileUtils.isOnRemovableStorage(album) - ? Icon( + ? const Icon( AIcons.removableStorage, size: 16, color: Colors.grey, diff --git a/lib/widgets/drawer/app_drawer.dart b/lib/widgets/drawer/app_drawer.dart index 283606d32..b7c6b80dc 100644 --- a/lib/widgets/drawer/app_drawer.dart +++ b/lib/widgets/drawer/app_drawer.dart @@ -54,12 +54,12 @@ class _AppDrawerState extends State { if (showVideos) videoTile, if (showFavourites) favouriteTile, _buildSpecialAlbumSection(), - Divider(), + const Divider(), albumListTile, countryListTile, tagListTile, if (!kReleaseMode) ...[ - Divider(), + const Divider(), debugTile, ], ]; @@ -101,7 +101,7 @@ class _AppDrawerState extends State { } return Container( - padding: EdgeInsets.only(left: 16, top: 16, right: 16, bottom: 8), + padding: const EdgeInsets.only(left: 16, top: 16, right: 16, bottom: 8), color: Theme.of(context).accentColor, child: SafeArea( bottom: false, @@ -114,10 +114,10 @@ class _AppDrawerState extends State { spacing: 16, crossAxisAlignment: WrapCrossAlignment.center, children: [ - AvesLogo(size: 64), + const AvesLogo(size: 64), Text( context.l10n.appName, - style: TextStyle( + style: const TextStyle( fontSize: 44, fontWeight: FontWeight.w300, letterSpacing: 1.0, @@ -127,7 +127,7 @@ class _AppDrawerState extends State { ], ), ), - SizedBox(height: 8), + const SizedBox(height: 8), OutlinedButtonTheme( data: OutlinedButtonThemeData( style: ButtonStyle( @@ -140,9 +140,9 @@ class _AppDrawerState extends State { runSpacing: 8, children: [ OutlinedButton.icon( - key: Key('drawer-about-button'), + key: const Key('drawer-about-button'), onPressed: () => goTo(AboutPage.routeName, (_) => AboutPage()), - icon: Icon(AIcons.info), + icon: const Icon(AIcons.info), label: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -156,11 +156,11 @@ class _AppDrawerState extends State { duration: Durations.newsBadgeAnimation, opacity: newVersion ? 1 : 0, child: Padding( - padding: EdgeInsetsDirectional.only(start: 2), + padding: const EdgeInsetsDirectional.only(start: 2), child: DecoratedBox( decoration: BoxDecoration( - border: Border.all(color: Colors.white70), - borderRadius: BorderRadius.circular(badgeSize), + border: const Border.fromBorderSide(BorderSide(color: Colors.white70)), + borderRadius: BorderRadius.all(Radius.circular(badgeSize)), ), child: Icon( Icons.circle, @@ -176,9 +176,9 @@ class _AppDrawerState extends State { ), ), OutlinedButton.icon( - key: Key('drawer-settings-button'), + key: const Key('drawer-settings-button'), onPressed: () => goTo(SettingsPage.routeName, (_) => SettingsPage()), - icon: Icon(AIcons.settings), + icon: const Icon(AIcons.settings), label: Text(context.l10n.settingsPageTitle), ), ], @@ -200,10 +200,10 @@ class _AppDrawerState extends State { }).toList() ..sort(source.compareAlbumsByName); - if (specialAlbums.isEmpty) return SizedBox.shrink(); + if (specialAlbums.isEmpty) return const SizedBox.shrink(); return Column( children: [ - Divider(), + const Divider(), ...specialAlbums.map((album) => AlbumTile(album)), ], ); @@ -213,19 +213,19 @@ class _AppDrawerState extends State { // tiles Widget get allCollectionTile => CollectionNavTile( - leading: Icon(AIcons.allCollection), + leading: const Icon(AIcons.allCollection), title: context.l10n.drawerCollectionAll, filter: null, ); Widget get videoTile => CollectionNavTile( - leading: Icon(AIcons.video), + leading: const Icon(AIcons.video), title: context.l10n.drawerCollectionVideos, filter: MimeFilter.video, ); Widget get favouriteTile => CollectionNavTile( - leading: Icon(AIcons.favourite), + leading: const Icon(AIcons.favourite), title: context.l10n.drawerCollectionFavourites, filter: FavouriteFilter.instance, ); diff --git a/lib/widgets/drawer/collection_tile.dart b/lib/widgets/drawer/collection_tile.dart index 221c280cd..667f92d85 100644 --- a/lib/widgets/drawer/collection_tile.dart +++ b/lib/widgets/drawer/collection_tile.dart @@ -40,7 +40,7 @@ class CollectionNavTile extends StatelessWidget { Navigator.pushAndRemoveUntil( context, MaterialPageRoute( - settings: RouteSettings(name: CollectionPage.routeName), + settings: const RouteSettings(name: CollectionPage.routeName), builder: (context) => CollectionPage(CollectionLens( source: context.read(), filters: [filter], diff --git a/lib/widgets/filter_grids/album_pick.dart b/lib/widgets/filter_grids/album_pick.dart index 1bc743cbe..5f9b714c1 100644 --- a/lib/widgets/filter_grids/album_pick.dart +++ b/lib/widgets/filter_grids/album_pick.dart @@ -113,7 +113,7 @@ class AlbumPickAppBar extends StatelessWidget { } return SliverAppBar( - leading: BackButton(), + leading: const BackButton(), title: SourceStateAwareAppBarTitle( title: Text(title()), source: source, @@ -123,7 +123,7 @@ class AlbumPickAppBar extends StatelessWidget { ), actions: [ IconButton( - icon: Icon(AIcons.createAlbum), + icon: const Icon(AIcons.createAlbum), onPressed: () async { final newAlbum = await showDialog( context: context, @@ -173,7 +173,7 @@ class AlbumFilterBar extends StatelessWidget implements PreferredSizeWidget { }); @override - Size get preferredSize => Size.fromHeight(preferredHeight); + Size get preferredSize => const Size.fromHeight(preferredHeight); @override Widget build(BuildContext context) { diff --git a/lib/widgets/filter_grids/albums_page.dart b/lib/widgets/filter_grids/albums_page.dart index b006cdfa6..e640c50bf 100644 --- a/lib/widgets/filter_grids/albums_page.dart +++ b/lib/widgets/filter_grids/albums_page.dart @@ -109,7 +109,7 @@ class AlbumListPage extends StatelessWidget { case AlbumChipGroupFactor.none: return { if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) - ChipSectionKey(): [ + const ChipSectionKey(): [ ...pinnedMapEntries, ...unpinnedMapEntries, ], diff --git a/lib/widgets/filter_grids/common/chip_set_action_delegate.dart b/lib/widgets/filter_grids/common/chip_set_action_delegate.dart index c9081d0e4..137a87e81 100644 --- a/lib/widgets/filter_grids/common/chip_set_action_delegate.dart +++ b/lib/widgets/filter_grids/common/chip_set_action_delegate.dart @@ -53,7 +53,7 @@ abstract class ChipSetActionDelegate { Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: StatsPage.routeName), + settings: const RouteSettings(name: StatsPage.routeName), builder: (context) => StatsPage( source: source, ), diff --git a/lib/widgets/filter_grids/common/decorated_filter_chip.dart b/lib/widgets/filter_grids/common/decorated_filter_chip.dart index ef2227af4..5ff7ffe83 100644 --- a/lib/widgets/filter_grids/common/decorated_filter_chip.dart +++ b/lib/widgets/filter_grids/common/decorated_filter_chip.dart @@ -73,7 +73,7 @@ class DecoratedFilterChip extends StatelessWidget { ); } default: - return SizedBox(); + return const SizedBox(); } }, ); @@ -143,7 +143,7 @@ class DecoratedFilterChip extends StatelessWidget { child: DecoratedIcon( AIcons.pin, color: FilterGridPage.detailColor, - shadows: [Constants.embossShadow], + shadows: Constants.embossShadows, size: iconSize, ), ), @@ -154,7 +154,7 @@ class DecoratedFilterChip extends StatelessWidget { child: DecoratedIcon( AIcons.removableStorage, color: FilterGridPage.detailColor, - shadows: [Constants.embossShadow], + shadows: Constants.embossShadows, size: iconSize, ), ), diff --git a/lib/widgets/filter_grids/common/filter_nav_page.dart b/lib/widgets/filter_grids/common/filter_nav_page.dart index b6348f980..c5dbb7499 100644 --- a/lib/widgets/filter_grids/common/filter_nav_page.dart +++ b/lib/widgets/filter_grids/common/filter_nav_page.dart @@ -53,7 +53,7 @@ class FilterNavigationPage extends StatelessWidget { Widget build(BuildContext context) { final isMainMode = context.select, bool>((vn) => vn.value == AppMode.main); return FilterGridPage( - key: Key('filter-grid-page'), + key: const Key('filter-grid-page'), appBar: SliverAppBar( title: InteractiveAppBarTitle( onTap: () => _goToSearch(context), @@ -73,13 +73,13 @@ class FilterNavigationPage extends StatelessWidget { emptyBuilder: () => ValueListenableBuilder( valueListenable: source.stateNotifier, builder: (context, sourceState, child) { - return sourceState != SourceState.loading ? emptyBuilder() : SizedBox.shrink(); + return sourceState != SourceState.loading ? emptyBuilder() : const SizedBox.shrink(); }, ), onTap: (filter) => Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: CollectionPage.routeName), + settings: const RouteSettings(name: CollectionPage.routeName), builder: (context) => CollectionPage(CollectionLens( source: source, filters: [filter], @@ -92,7 +92,7 @@ class FilterNavigationPage extends StatelessWidget { void _showMenu(BuildContext context, T filter, Offset? tapPosition) async { final overlay = Overlay.of(context)!.context.findRenderObject() as RenderBox; - final touchArea = Size(40, 40); + const touchArea = Size(40, 40); final selectedAction = await showMenu( context: context, position: RelativeRect.fromRect((tapPosition ?? Offset.zero) & touchArea, Offset.zero & overlay.size), @@ -113,11 +113,11 @@ class FilterNavigationPage extends StatelessWidget { return [ CollectionSearchButton(source), PopupMenuButton( - key: Key('appbar-menu-button'), + key: const Key('appbar-menu-button'), itemBuilder: (context) { return [ PopupMenuItem( - key: Key('menu-sort'), + key: const Key('menu-sort'), value: ChipSetAction.sort, child: MenuRow(text: context.l10n.menuActionSort, icon: AIcons.sort), ), diff --git a/lib/widgets/filter_grids/common/overlay.dart b/lib/widgets/filter_grids/common/overlay.dart index 6b3cd556b..7c2322ee0 100644 --- a/lib/widgets/filter_grids/common/overlay.dart +++ b/lib/widgets/filter_grids/common/overlay.dart @@ -34,10 +34,10 @@ class _ChipHighlightOverlayState extends State { return Sweeper( builder: (context) => Container( decoration: BoxDecoration( - border: Border.all( + border: Border.fromBorderSide(BorderSide( color: Theme.of(context).accentColor, width: widget.extent * .1, - ), + )), borderRadius: widget.borderRadius, ), ), diff --git a/lib/widgets/filter_grids/common/section_keys.dart b/lib/widgets/filter_grids/common/section_keys.dart index 94231a438..5e7c661b2 100644 --- a/lib/widgets/filter_grids/common/section_keys.dart +++ b/lib/widgets/filter_grids/common/section_keys.dart @@ -80,5 +80,5 @@ class StorageVolumeSectionKey extends ChipSectionKey { StorageVolumeSectionKey(BuildContext context, this.volume) : super(title: volume?.getDescription(context) ?? context.l10n.sectionUnknown); @override - Widget? get leading => (volume?.isRemovable ?? false) ? Icon(AIcons.removableStorage) : null; + Widget? get leading => (volume?.isRemovable ?? false) ? const Icon(AIcons.removableStorage) : null; } diff --git a/lib/widgets/filter_grids/countries_page.dart b/lib/widgets/filter_grids/countries_page.dart index 087e00c5e..a759cfcea 100644 --- a/lib/widgets/filter_grids/countries_page.dart +++ b/lib/widgets/filter_grids/countries_page.dart @@ -65,7 +65,7 @@ class CountryListPage extends StatelessWidget { return { if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) - ChipSectionKey(): [ + const ChipSectionKey(): [ ...pinnedMapEntries, ...unpinnedMapEntries, ], diff --git a/lib/widgets/filter_grids/tags_page.dart b/lib/widgets/filter_grids/tags_page.dart index 6b0f86520..b6f05e5c1 100644 --- a/lib/widgets/filter_grids/tags_page.dart +++ b/lib/widgets/filter_grids/tags_page.dart @@ -65,7 +65,7 @@ class TagListPage extends StatelessWidget { return { if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) - ChipSectionKey(): [ + const ChipSectionKey(): [ ...pinnedMapEntries, ...unpinnedMapEntries, ], diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 8649853e5..8acb9c8d8 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -50,7 +50,7 @@ class _HomePageState extends State { } @override - Widget build(BuildContext context) => Scaffold(); + Widget build(BuildContext context) => const Scaffold(); Future _setup() async { final permissions = await [ @@ -127,7 +127,7 @@ class _HomePageState extends State { Route _getRedirectRoute(AppMode appMode) { if (appMode == AppMode.view) { return DirectMaterialPageRoute( - settings: RouteSettings(name: EntryViewerPage.routeName), + settings: const RouteSettings(name: EntryViewerPage.routeName), builder: (_) => EntryViewerPage( initialEntry: _viewerEntry!, ), @@ -146,7 +146,7 @@ class _HomePageState extends State { switch (routeName) { case AlbumListPage.routeName: return DirectMaterialPageRoute( - settings: RouteSettings(name: AlbumListPage.routeName), + settings: const RouteSettings(name: AlbumListPage.routeName), builder: (_) => AlbumListPage(), ); case SearchPage.routeName: @@ -156,7 +156,7 @@ class _HomePageState extends State { case CollectionPage.routeName: default: return DirectMaterialPageRoute( - settings: RouteSettings(name: CollectionPage.routeName), + settings: const RouteSettings(name: CollectionPage.routeName), builder: (_) => CollectionPage( CollectionLens( source: source, diff --git a/lib/widgets/search/expandable_filter_row.dart b/lib/widgets/search/expandable_filter_row.dart index e6d6a443e..28ae3a10c 100644 --- a/lib/widgets/search/expandable_filter_row.dart +++ b/lib/widgets/search/expandable_filter_row.dart @@ -25,7 +25,7 @@ class ExpandableFilterRow extends StatelessWidget { @override Widget build(BuildContext context) { - if (filters.isEmpty) return SizedBox.shrink(); + if (filters.isEmpty) return const SizedBox.shrink(); final hasTitle = title != null && title!.isNotEmpty; @@ -34,7 +34,7 @@ class ExpandableFilterRow extends StatelessWidget { Widget? titleRow; if (hasTitle) { titleRow = Padding( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), child: Row( children: [ Text( @@ -55,7 +55,7 @@ class ExpandableFilterRow extends StatelessWidget { final filterList = filters.toList(); final wrap = Container( key: ValueKey('wrap$title'), - padding: EdgeInsets.symmetric(horizontal: horizontalPadding), + padding: const EdgeInsets.symmetric(horizontal: horizontalPadding), // specify transparent as a workaround to prevent // chip border clipping when the floating app bar is fading color: Colors.transparent, @@ -73,12 +73,12 @@ class ExpandableFilterRow extends StatelessWidget { height: AvesFilterChip.minChipHeight, child: ListView.separated( scrollDirection: Axis.horizontal, - physics: BouncingScrollPhysics(), - padding: EdgeInsets.symmetric(horizontal: horizontalPadding), + physics: const BouncingScrollPhysics(), + padding: const EdgeInsets.symmetric(horizontal: horizontalPadding), itemBuilder: (context, index) { - return index < filterList.length ? _buildFilterChip(filterList[index]) : SizedBox(); + return index < filterList.length ? _buildFilterChip(filterList[index]) : const SizedBox(); }, - separatorBuilder: (context, index) => SizedBox(width: 8), + separatorBuilder: (context, index) => const SizedBox(width: 8), itemCount: filterList.length, ), ); diff --git a/lib/widgets/search/search_button.dart b/lib/widgets/search/search_button.dart index 36990e5df..21f37df81 100644 --- a/lib/widgets/search/search_button.dart +++ b/lib/widgets/search/search_button.dart @@ -13,8 +13,8 @@ class CollectionSearchButton extends StatelessWidget { @override Widget build(BuildContext context) { return IconButton( - key: Key('search-button'), - icon: Icon(AIcons.search), + key: const Key('search-button'), + icon: const Icon(AIcons.search), onPressed: () => _goToSearch(context), tooltip: MaterialLocalizations.of(context).searchFieldLabel, ); diff --git a/lib/widgets/search/search_delegate.dart b/lib/widgets/search/search_delegate.dart index 5aaaef05d..254ffc014 100644 --- a/lib/widgets/search/search_delegate.dart +++ b/lib/widgets/search/search_delegate.dart @@ -53,7 +53,7 @@ class CollectionSearchDelegate { onPressed: () => _goBack(context), tooltip: MaterialLocalizations.of(context).backButtonTooltip, ) - : CloseButton( + : const CloseButton( onPressed: SystemNavigator.pop, ); } @@ -62,7 +62,7 @@ class CollectionSearchDelegate { return [ if (query.isNotEmpty) IconButton( - icon: Icon(AIcons.clear), + icon: const Icon(AIcons.clear), onPressed: () { query = ''; showSuggestions(context); @@ -93,7 +93,7 @@ class CollectionSearchDelegate { final history = settings.searchHistory.where(notHidden).toList(); return ListView( - padding: EdgeInsets.only(top: 8), + padding: const EdgeInsets.only(top: 8), children: [ _buildFilterRow( context: context, @@ -195,7 +195,7 @@ class CollectionSearchDelegate { // and possibly trigger a rebuild here _select(context, _buildQueryFilter(true)); }); - return SizedBox.shrink(); + return const SizedBox.shrink(); } QueryFilter? _buildQueryFilter(bool colorful) { @@ -242,7 +242,7 @@ class CollectionSearchDelegate { Navigator.pushAndRemoveUntil( context, MaterialPageRoute( - settings: RouteSettings(name: CollectionPage.routeName), + settings: const RouteSettings(name: CollectionPage.routeName), builder: (context) => CollectionPage(CollectionLens( source: source, filters: [filter], @@ -302,7 +302,7 @@ enum SearchBody { suggestions, results } class SearchPageRoute extends PageRoute { SearchPageRoute({ required this.delegate, - }) : super(settings: RouteSettings(name: SearchPage.routeName)) { + }) : super(settings: const RouteSettings(name: SearchPage.routeName)) { assert( delegate.route == null, 'The ${delegate.runtimeType} instance is currently used by another active ' diff --git a/lib/widgets/search/search_page.dart b/lib/widgets/search/search_page.dart index b6437ebd0..534e0858a 100644 --- a/lib/widgets/search/search_page.dart +++ b/lib/widgets/search/search_page.dart @@ -93,13 +93,13 @@ class _SearchPageState extends State { switch (widget.delegate.currentBody) { case SearchBody.suggestions: body = KeyedSubtree( - key: ValueKey(SearchBody.suggestions), + key: const ValueKey(SearchBody.suggestions), child: widget.delegate.buildSuggestions(context), ); break; case SearchBody.results: body = KeyedSubtree( - key: ValueKey(SearchBody.results), + key: const ValueKey(SearchBody.results), child: widget.delegate.buildResults(context), ); break; diff --git a/lib/widgets/settings/access_grants.dart b/lib/widgets/settings/access_grants.dart index 0b6c075cc..23ae4a6dd 100644 --- a/lib/widgets/settings/access_grants.dart +++ b/lib/widgets/settings/access_grants.dart @@ -13,7 +13,7 @@ class StorageAccessTile extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: StorageAccessPage.routeName), + settings: const RouteSettings(name: StorageAccessPage.routeName), builder: (context) => StorageAccessPage(), ), ); @@ -52,16 +52,16 @@ class _StorageAccessPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Row( children: [ - Icon(AIcons.info), - SizedBox(width: 16), + const Icon(AIcons.info), + const SizedBox(width: 16), Expanded(child: Text(context.l10n.settingsStorageAccessBanner)), ], ), ), - Divider(), + const Divider(), Expanded( child: FutureBuilder>( future: _pathLoader, @@ -70,7 +70,7 @@ class _StorageAccessPageState extends State { return Text(snapshot.error.toString()); } if (snapshot.connectionState != ConnectionState.done && _lastPaths == null) { - return SizedBox.shrink(); + return const SizedBox.shrink(); } _lastPaths = snapshot.data!..sort(); if (_lastPaths!.isEmpty) { @@ -85,7 +85,7 @@ class _StorageAccessPageState extends State { title: Text(path), dense: true, trailing: IconButton( - icon: Icon(AIcons.clear), + icon: const Icon(AIcons.clear), onPressed: () async { await storageService.revokeDirectoryAccess(path); _load(); diff --git a/lib/widgets/settings/entry_background.dart b/lib/widgets/settings/entry_background.dart index 5f3c58782..5f2c59ba6 100644 --- a/lib/widgets/settings/entry_background.dart +++ b/lib/widgets/settings/entry_background.dart @@ -45,7 +45,7 @@ class _EntryBackgroundSelectorState extends State { Widget? child; switch (selected) { case EntryBackground.transparent: - child = Icon( + child = const Icon( Icons.clear, size: 20, color: Colors.white30, diff --git a/lib/widgets/settings/hidden_filters.dart b/lib/widgets/settings/hidden_filters.dart index 526b353f8..6e5a71f55 100644 --- a/lib/widgets/settings/hidden_filters.dart +++ b/lib/widgets/settings/hidden_filters.dart @@ -16,7 +16,7 @@ class HiddenFilterTile extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: HiddenFilterPage.routeName), + settings: const RouteSettings(name: HiddenFilterPage.routeName), builder: (context) => HiddenFilterPage(), ), ); @@ -39,19 +39,19 @@ class HiddenFilterPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Row( children: [ - Icon(AIcons.info), - SizedBox(width: 16), + const Icon(AIcons.info), + const SizedBox(width: 16), Expanded(child: Text(context.l10n.settingsHiddenFiltersBanner)), ], ), ), - Divider(), + const Divider(), Expanded( child: Padding( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), child: Consumer( builder: (context, settings, child) { final hiddenFilters = settings.hiddenFilters; diff --git a/lib/widgets/settings/quick_actions/available_actions.dart b/lib/widgets/settings/quick_actions/available_actions.dart index 204969d02..76ebd1aae 100644 --- a/lib/widgets/settings/quick_actions/available_actions.dart +++ b/lib/widgets/settings/quick_actions/available_actions.dart @@ -53,7 +53,7 @@ class AvailableActionPanel extends StatelessWidget { return AnimatedBuilder( animation: Listenable.merge([quickActionsChangeNotifier, draggedAvailableAction]), builder: (context, child) => Padding( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), child: Wrap( alignment: WrapAlignment.spaceEvenly, spacing: 8, diff --git a/lib/widgets/settings/quick_actions/common.dart b/lib/widgets/settings/quick_actions/common.dart index 8faee0e46..849091f5f 100644 --- a/lib/widgets/settings/quick_actions/common.dart +++ b/lib/widgets/settings/quick_actions/common.dart @@ -18,16 +18,16 @@ class ActionPanel extends StatelessWidget { return AnimatedContainer( foregroundDecoration: BoxDecoration( color: color.withOpacity(.2), - border: Border.all( + border: Border.fromBorderSide(BorderSide( color: color, width: highlight ? 2 : 1, - ), - borderRadius: BorderRadius.circular(8), + )), + borderRadius: const BorderRadius.all(Radius.circular(8)), ), - margin: EdgeInsets.all(16), + margin: const EdgeInsets.all(16), duration: Durations.quickActionHighlightAnimation, child: ClipRRect( - borderRadius: BorderRadius.circular(8), + borderRadius: const BorderRadius.all(Radius.circular(8)), child: child, ), ); @@ -54,7 +54,7 @@ class ActionButton extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ - SizedBox(height: padding), + const SizedBox(height: padding), OverlayButton( child: IconButton( icon: Icon(action.getIcon()), @@ -62,7 +62,7 @@ class ActionButton extends StatelessWidget { ), ), if (showCaption) ...[ - SizedBox(height: padding), + const SizedBox(height: padding), Text( action.getText(context), style: enabled ? textStyle : textStyle!.copyWith(color: textStyle.color!.withOpacity(.2)), @@ -71,7 +71,7 @@ class ActionButton extends StatelessWidget { maxLines: 2, ), ], - SizedBox(height: padding), + const SizedBox(height: padding), ], ), ); diff --git a/lib/widgets/settings/quick_actions/editor.dart b/lib/widgets/settings/quick_actions/editor.dart index b62e1083b..151c136ff 100644 --- a/lib/widgets/settings/quick_actions/editor.dart +++ b/lib/widgets/settings/quick_actions/editor.dart @@ -24,7 +24,7 @@ class QuickActionsTile extends StatelessWidget { Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: QuickActionEditorPage.routeName), + settings: const RouteSettings(name: QuickActionEditorPage.routeName), builder: (context) => QuickActionEditorPage(), ), ); @@ -71,7 +71,7 @@ class _QuickActionEditorPageState extends State { void _onQuickActionTargetLeave() { _stopLeavingTimer(); final action = _draggedAvailableAction.value; - _targetLeavingTimer = Timer(Durations.quickActionListAnimation + Duration(milliseconds: 50), () { + _targetLeavingTimer = Timer(Durations.quickActionListAnimation + const Duration(milliseconds: 50), () { _removeQuickAction(action); _quickActionHighlight.value = false; }); @@ -111,18 +111,18 @@ class _QuickActionEditorPageState extends State { child: ListView( children: [ Padding( - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Row( children: [ - Icon(AIcons.info), - SizedBox(width: 16), + const Icon(AIcons.info), + const SizedBox(width: 16), Expanded(child: Text(context.l10n.settingsViewerQuickActionEditorBanner)), ], ), ), - Divider(), + const Divider(), Padding( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( context.l10n.settingsViewerQuickActionEditorDisplayedButtons, style: Constants.titleTextStyle, @@ -161,7 +161,7 @@ class _QuickActionEditorPageState extends State { shrinkWrap: true, padding: EdgeInsets.zero, itemBuilder: (context, index, animation) { - if (index >= _quickActions.length) return SizedBox(); + if (index >= _quickActions.length) return const SizedBox(); final action = _quickActions[index]; return QuickActionButton( placement: QuickActionPlacement.action, @@ -186,14 +186,14 @@ class _QuickActionEditorPageState extends State { style: Theme.of(context).textTheme.caption, ), ) - : SizedBox(), + : const SizedBox(), ), ], ), ), ), Padding( - padding: EdgeInsets.symmetric(horizontal: 16), + padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( context.l10n.settingsViewerQuickActionEditorAvailableButtons, style: Constants.titleTextStyle, @@ -278,7 +278,7 @@ class _QuickActionEditorPageState extends State { axis: Axis.horizontal, sizeFactor: animation, child: Padding( - padding: EdgeInsets.symmetric(vertical: _QuickActionEditorPageState.quickActionVerticalPadding, horizontal: 4), + padding: const EdgeInsets.symmetric(vertical: _QuickActionEditorPageState.quickActionVerticalPadding, horizontal: 4), child: OverlayButton( child: IconButton( icon: Icon(action.getIcon()), diff --git a/lib/widgets/settings/quick_actions/quick_actions.dart b/lib/widgets/settings/quick_actions/quick_actions.dart index e7e8dd28e..9dd10212a 100644 --- a/lib/widgets/settings/quick_actions/quick_actions.dart +++ b/lib/widgets/settings/quick_actions/quick_actions.dart @@ -52,7 +52,7 @@ class QuickActionButton extends StatelessWidget { }, onAcceptWithDetails: (details) => _setPanelHighlight(false), onLeave: (data) => onTargetLeave(), - builder: (context, accepted, rejected) => child ?? SizedBox(), + builder: (context, accepted, rejected) => child ?? const SizedBox(), ); } diff --git a/lib/widgets/settings/settings_page.dart b/lib/widgets/settings/settings_page.dart index 4a8487ae7..a8316fcf6 100644 --- a/lib/widgets/settings/settings_page.dart +++ b/lib/widgets/settings/settings_page.dart @@ -47,14 +47,14 @@ class _SettingsPageState extends State { data: theme.copyWith( textTheme: theme.textTheme.copyWith( // dense style font for tile subtitles, without modifying title font - bodyText2: TextStyle(fontSize: 12), + bodyText2: const TextStyle(fontSize: 12), ), ), child: SafeArea( child: Consumer( builder: (context, settings, child) => AnimationLimiter( child: ListView( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), children: AnimationConfiguration.toStaggeredList( duration: Durations.staggeredAnimation, delay: Durations.staggeredAnimationDelay, @@ -333,17 +333,17 @@ class _SettingsPageState extends State { } Widget _buildLeading(IconData icon, Color color) => Container( - padding: EdgeInsets.all(6), + padding: const EdgeInsets.all(6), decoration: BoxDecoration( - border: Border.all( + border: Border.fromBorderSide(BorderSide( color: color, width: AvesFilterChip.outlineWidth, - ), + )), shape: BoxShape.circle, ), child: DecoratedIcon( icon, - shadows: [Constants.embossShadow], + shadows: Constants.embossShadows, size: 18, ), ); diff --git a/lib/widgets/stats/filter_table.dart b/lib/widgets/stats/filter_table.dart index f062f3e57..e5491e59a 100644 --- a/lib/widgets/stats/filter_table.dart +++ b/lib/widgets/stats/filter_table.dart @@ -36,7 +36,7 @@ class FilterTable extends StatelessWidget { final lineHeight = 16 * textScaleFactor; return Padding( - padding: EdgeInsetsDirectional.only(start: AvesFilterChip.outlineWidth / 2 + 6, end: 8), + padding: const EdgeInsetsDirectional.only(start: AvesFilterChip.outlineWidth / 2 + 6, end: 8), child: LayoutBuilder( builder: (context, constraints) { final showPercentIndicator = constraints.maxWidth - (chipWidth + countWidth) > percentIndicatorMinWidth; @@ -52,7 +52,7 @@ class FilterTable extends StatelessWidget { // the `Table` `border` property paints on the cells and does not add margins, // so we define margins here instead, but they should be symmetric // to keep all cells vertically aligned on the center/middle - margin: EdgeInsets.symmetric(vertical: 4), + margin: const EdgeInsets.symmetric(vertical: 4), alignment: AlignmentDirectional.centerStart, child: AvesFilterChip( filter: filter, @@ -69,20 +69,20 @@ class FilterTable extends StatelessWidget { padding: EdgeInsets.symmetric(horizontal: lineHeight), center: Text( NumberFormat.percentPattern().format(percent), - style: TextStyle(shadows: [Constants.embossShadow]), + style: const TextStyle(shadows: Constants.embossShadows), ), ), Text( '$count', - style: TextStyle(color: Colors.white70), + style: const TextStyle(color: Colors.white70), textAlign: TextAlign.end, ), ], ); }).toList(), columnWidths: { - 0: MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(chipWidth)), - 2: MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(countWidth)), + 0: const MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(chipWidth)), + 2: const MaxColumnWidth(IntrinsicColumnWidth(), FixedColumnWidth(countWidth)), }, defaultVerticalAlignment: TableCellVerticalAlignment.middle, ); diff --git a/lib/widgets/stats/stats.dart b/lib/widgets/stats/stats.dart index d6f27be3a..d84808cd9 100644 --- a/lib/widgets/stats/stats.dart +++ b/lib/widgets/stats/stats.dart @@ -16,7 +16,6 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/stats/filter_table.dart'; - // ignore: import_of_legacy_library_into_null_safe import 'package:charts_flutter/flutter.dart' as charts; import 'package:collection/collection.dart'; @@ -87,7 +86,7 @@ class StatsPage extends StatelessWidget { final textScaleFactor = MediaQuery.textScaleFactorOf(context); final lineHeight = 16 * textScaleFactor; final locationIndicator = Padding( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), child: Column( children: [ LinearPercentIndicator( @@ -96,15 +95,15 @@ class StatsPage extends StatelessWidget { backgroundColor: Colors.white24, progressColor: Theme.of(context).accentColor, animation: true, - leading: Icon(AIcons.location), + leading: const Icon(AIcons.location), // right padding to match leading, so that inside label is aligned with outside label below - padding: EdgeInsets.symmetric(horizontal: lineHeight) + EdgeInsets.only(right: 24), + padding: EdgeInsets.symmetric(horizontal: lineHeight) + const EdgeInsets.only(right: 24), center: Text( NumberFormat.percentPattern().format(withGpsPercent), - style: TextStyle(shadows: [Constants.embossShadow]), + style: const TextStyle(shadows: Constants.embossShadows), ), ), - SizedBox(height: 8), + const SizedBox(height: 8), Text(context.l10n.statsWithGps(withGpsCount)), ], ), @@ -132,7 +131,7 @@ class StatsPage extends StatelessWidget { } Widget _buildMimeDonut(BuildContext context, String Function(int) label, Map byMimeTypes) { - if (byMimeTypes.isEmpty) return SizedBox.shrink(); + if (byMimeTypes.isEmpty) return const SizedBox.shrink(); final sum = byMimeTypes.values.fold(0, (prev, v) => prev + v); @@ -193,12 +192,12 @@ class StatsPage extends StatelessWidget { WidgetSpan( alignment: PlaceholderAlignment.middle, child: Padding( - padding: EdgeInsetsDirectional.only(end: 8), + padding: const EdgeInsetsDirectional.only(end: 8), child: Icon(AIcons.disc, color: d.color), ), ), TextSpan(text: '${d.displayText} '), - TextSpan(text: '${d.entryCount}', style: TextStyle(color: Colors.white70)), + TextSpan(text: '${d.entryCount}', style: const TextStyle(color: Colors.white70)), ], ), overflow: TextOverflow.fade, @@ -235,7 +234,7 @@ class StatsPage extends StatelessWidget { return [ Padding( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), child: Text( title, style: Constants.titleTextStyle, @@ -272,7 +271,7 @@ class StatsPage extends StatelessWidget { Navigator.pushAndRemoveUntil( context, MaterialPageRoute( - settings: RouteSettings(name: CollectionPage.routeName), + settings: const RouteSettings(name: CollectionPage.routeName), builder: (context) => CollectionPage(CollectionLens( source: source, filters: [filter], diff --git a/lib/widgets/viewer/debug/db.dart b/lib/widgets/viewer/debug/db.dart index dba1a7e1d..a6aa3601d 100644 --- a/lib/widgets/viewer/debug/db.dart +++ b/lib/widgets/viewer/debug/db.dart @@ -40,13 +40,13 @@ class _DbTabState extends State { @override Widget build(BuildContext context) { return ListView( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), children: [ FutureBuilder( future: _dbDateLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = snapshot.data; return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -60,12 +60,12 @@ class _DbTabState extends State { ); }, ), - SizedBox(height: 16), + const SizedBox(height: 16), FutureBuilder( future: _dbEntryLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = snapshot.data; return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -89,12 +89,12 @@ class _DbTabState extends State { ); }, ), - SizedBox(height: 16), + const SizedBox(height: 16), FutureBuilder( future: _dbMetadataLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = snapshot.data; return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -116,12 +116,12 @@ class _DbTabState extends State { ); }, ), - SizedBox(height: 16), + const SizedBox(height: 16), FutureBuilder( future: _dbAddressLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final data = snapshot.data; return Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/widgets/viewer/debug/debug_page.dart b/lib/widgets/viewer/debug/debug_page.dart index af8cd13c2..fb6e927a1 100644 --- a/lib/widgets/viewer/debug/debug_page.dart +++ b/lib/widgets/viewer/debug/debug_page.dart @@ -21,16 +21,16 @@ class ViewerDebugPage extends StatelessWidget { @override Widget build(BuildContext context) { final tabs = >[ - Tuple2(Tab(text: 'Entry'), _buildEntryTabView()), - if (context.select, bool>((vn) => vn.value != AppMode.view)) Tuple2(Tab(text: 'DB'), DbTab(entry: entry)), - Tuple2(Tab(icon: Icon(AIcons.android)), MetadataTab(entry: entry)), - Tuple2(Tab(icon: Icon(AIcons.image)), _buildThumbnailsTabView()), + Tuple2(const Tab(text: 'Entry'), _buildEntryTabView()), + if (context.select, bool>((vn) => vn.value != AppMode.view)) Tuple2(const Tab(text: 'DB'), DbTab(entry: entry)), + Tuple2(const Tab(icon: Icon(AIcons.android)), MetadataTab(entry: entry)), + Tuple2(const Tab(icon: Icon(AIcons.image)), _buildThumbnailsTabView()), ]; return DefaultTabController( length: tabs.length, child: Scaffold( appBar: AppBar( - title: Text('Debug'), + title: const Text('Debug'), bottom: TabBar( tabs: tabs.map((t) => t.item1).toList(), ), @@ -54,7 +54,7 @@ class ViewerDebugPage extends StatelessWidget { } return ListView( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), children: [ InfoRowGroup({ 'uri': '${entry.uri}', @@ -66,13 +66,13 @@ class ViewerDebugPage extends StatelessWidget { 'sourceMimeType': '${entry.sourceMimeType}', 'mimeType': '${entry.mimeType}', }), - Divider(), + const Divider(), InfoRowGroup({ 'dateModifiedSecs': toDateValue(entry.dateModifiedSecs, factor: 1000), 'sourceDateTakenMillis': toDateValue(entry.sourceDateTakenMillis), 'bestDate': '${entry.bestDate}', }), - Divider(), + const Divider(), InfoRowGroup({ 'width': '${entry.width}', 'height': '${entry.height}', @@ -83,12 +83,12 @@ class ViewerDebugPage extends StatelessWidget { 'displayAspectRatio': '${entry.displayAspectRatio}', 'displaySize': '${entry.displaySize}', }), - Divider(), + const Divider(), InfoRowGroup({ 'durationMillis': '${entry.durationMillis}', 'durationText': '${entry.durationText}', }), - Divider(), + const Divider(), InfoRowGroup({ 'sizeBytes': '${entry.sizeBytes}', 'isFavourite': '${entry.isFavourite}', @@ -104,7 +104,7 @@ class ViewerDebugPage extends StatelessWidget { 'canRotateAndFlip': '${entry.canRotateAndFlip}', 'xmpSubjects': '${entry.xmpSubjects}', }), - Divider(), + const Divider(), InfoRowGroup({ 'hasGps': '${entry.hasGps}', 'hasAddress': '${entry.hasAddress}', @@ -121,7 +121,7 @@ class ViewerDebugPage extends StatelessWidget { if (entry.isSvg) { const extent = 128.0; children.addAll([ - Text('SVG ($extent)'), + const Text('SVG ($extent)'), SvgPicture( UriPicture( uri: entry.uri, @@ -140,12 +140,12 @@ class ViewerDebugPage extends StatelessWidget { image: provider, ), ), - SizedBox(height: 16), + const SizedBox(height: 16), ]), ); } return ListView( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), children: children, ); } diff --git a/lib/widgets/viewer/debug/metadata.dart b/lib/widgets/viewer/debug/metadata.dart index a36d6c515..d0d55fd5b 100644 --- a/lib/widgets/viewer/debug/metadata.dart +++ b/lib/widgets/viewer/debug/metadata.dart @@ -65,7 +65,7 @@ class _MetadataTabState extends State { children: [ if (data.isNotEmpty) Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: InfoRowGroup( data, maxValueLength: Constants.infoGroupMaxValueLength, @@ -77,12 +77,12 @@ class _MetadataTabState extends State { Widget builderFromSnapshot(BuildContext context, AsyncSnapshot snapshot, String title) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return builderFromSnapshotData(context, snapshot.data!, title); } return ListView( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), children: [ FutureBuilder( future: _bitmapFactoryLoader, @@ -109,7 +109,7 @@ class _MetadataTabState extends State { future: _tiffStructureLoader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); return Column( crossAxisAlignment: CrossAxisAlignment.start, children: snapshot.data!.entries.map((kv) => builderFromSnapshotData(context, kv.value as Map, 'TIFF ${kv.key}')).toList(), diff --git a/lib/widgets/viewer/entry_action_delegate.dart b/lib/widgets/viewer/entry_action_delegate.dart index 53d449358..137b5b02c 100644 --- a/lib/widgets/viewer/entry_action_delegate.dart +++ b/lib/widgets/viewer/entry_action_delegate.dart @@ -156,7 +156,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix final destinationAlbum = await Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: AlbumPickPage.routeName), + settings: const RouteSettings(name: AlbumPickPage.routeName), builder: (context) => AlbumPickPage(source: source, moveType: MoveType.export), ), ); @@ -227,7 +227,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: SourceViewerPage.routeName), + settings: const RouteSettings(name: SourceViewerPage.routeName), builder: (context) => SourceViewerPage( loader: () => imageFileService.getSvg(entry.uri, entry.mimeType).then(utf8.decode), ), @@ -239,7 +239,7 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin, SizeAwareMix Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: ViewerDebugPage.routeName), + settings: const RouteSettings(name: ViewerDebugPage.routeName), builder: (context) => ViewerDebugPage(entry: entry), ), ); diff --git a/lib/widgets/viewer/entry_horizontal_pager.dart b/lib/widgets/viewer/entry_horizontal_pager.dart index 69aa77926..d2f09ccff 100644 --- a/lib/widgets/viewer/entry_horizontal_pager.dart +++ b/lib/widgets/viewer/entry_horizontal_pager.dart @@ -35,10 +35,10 @@ class _MultiEntryScrollerState extends State with AutomaticK return MagnifierGestureDetectorScope( axis: [Axis.horizontal, Axis.vertical], child: PageView.builder( - key: Key('horizontal-pageview'), + key: const Key('horizontal-pageview'), scrollDirection: Axis.horizontal, controller: widget.pageController, - physics: MagnifierScrollerPhysics(parent: BouncingScrollPhysics()), + physics: const MagnifierScrollerPhysics(parent: BouncingScrollPhysics()), onPageChanged: widget.onPageChanged, itemBuilder: (context, index) { final entry = entries[index]; @@ -77,7 +77,7 @@ class _MultiEntryScrollerState extends State with AutomaticK selector: (c, mq) => mq.size, builder: (c, mqSize, child) { return EntryPageView( - key: Key('imageview'), + key: const Key('imageview'), mainEntry: mainEntry, pageEntry: pageEntry ?? mainEntry, viewportSize: mqSize, diff --git a/lib/widgets/viewer/entry_vertical_pager.dart b/lib/widgets/viewer/entry_vertical_pager.dart index 8b34d55e0..70fc8852e 100644 --- a/lib/widgets/viewer/entry_vertical_pager.dart +++ b/lib/widgets/viewer/entry_vertical_pager.dart @@ -82,7 +82,7 @@ class _ViewerVerticalPageViewState extends State { @override Widget build(BuildContext context) { // fake page for opacity transition between collection and viewer - final transitionPage = SizedBox(); + const transitionPage = SizedBox(); final imagePage = hasCollection ? MultiEntryScroller( @@ -95,7 +95,7 @@ class _ViewerVerticalPageViewState extends State { ? SingleEntryScroller( entry: entry!, ) - : SizedBox(); + : const SizedBox(); final infoPage = NotificationListener( onNotification: (notification) { @@ -130,10 +130,10 @@ class _ViewerVerticalPageViewState extends State { child: child, ), child: PageView( - key: Key('vertical-pageview'), + key: const Key('vertical-pageview'), scrollDirection: Axis.vertical, controller: widget.verticalPager, - physics: MagnifierScrollerPhysics(parent: PageScrollPhysics()), + physics: const MagnifierScrollerPhysics(parent: PageScrollPhysics()), onPageChanged: widget.onVerticalPageChanged, children: pages, ), diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index e7d2948ff..047846027 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -101,7 +101,7 @@ class _EntryViewerStackState extends State with SingleTickerPr // no bounce at the bottom, to avoid video controller displacement curve: Curves.easeOutQuad, ); - _bottomOverlayOffset = Tween(begin: Offset(0, 1), end: Offset(0, 0)).animate(CurvedAnimation( + _bottomOverlayOffset = Tween(begin: const Offset(0, 1), end: const Offset(0, 0)).animate(CurvedAnimation( parent: _overlayAnimationController, curve: Curves.easeOutQuad, )); @@ -220,7 +220,7 @@ class _EntryViewerStackState extends State with SingleTickerPr Widget child = ValueListenableBuilder( valueListenable: _entryNotifier, builder: (context, mainEntry, child) { - if (mainEntry == null) return SizedBox.shrink(); + if (mainEntry == null) return const SizedBox.shrink(); return ViewerTopOverlay( mainEntry: mainEntry, @@ -276,7 +276,7 @@ class _EntryViewerStackState extends State with SingleTickerPr Widget child = ValueListenableBuilder( valueListenable: _entryNotifier, builder: (context, mainEntry, child) { - if (mainEntry == null) return SizedBox.shrink(); + if (mainEntry == null) return const SizedBox.shrink(); Widget? _buildExtraBottomOverlay(AvesEntry pageEntry) { // a 360 video is both a video and a panorama but only the video controls are displayed @@ -304,12 +304,12 @@ class _EntryViewerStackState extends State with SingleTickerPr stream: multiPageController.infoStream, builder: (context, snapshot) { final multiPageInfo = multiPageController.info; - if (multiPageInfo == null) return SizedBox.shrink(); + if (multiPageInfo == null) return const SizedBox.shrink(); return ValueListenableBuilder( valueListenable: multiPageController.pageNotifier, builder: (context, page, child) { final pageEntry = multiPageInfo.getPageEntryByIndex(page); - return _buildExtraBottomOverlay(pageEntry) ?? SizedBox(); + return _buildExtraBottomOverlay(pageEntry) ?? const SizedBox(); }, ); }) @@ -380,7 +380,7 @@ class _EntryViewerStackState extends State with SingleTickerPr Navigator.pushAndRemoveUntil( context, MaterialPageRoute( - settings: RouteSettings(name: CollectionPage.routeName), + settings: const RouteSettings(name: CollectionPage.routeName), builder: (context) { return CollectionPage( CollectionLens( @@ -606,7 +606,7 @@ class _EntryViewerStackState extends State with SingleTickerPr // video decoding may fail or have initial artifacts when the player initializes // during this widget initialization (because of the page transition and hero animation?) // so we play after a delay for increased stability - await Future.delayed(Duration(milliseconds: 300) * timeDilation); + await Future.delayed(const Duration(milliseconds: 300) * timeDilation); await videoController.play(); diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart index e898ee593..8de74ef42 100644 --- a/lib/widgets/viewer/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -91,9 +91,9 @@ class BasicSection extends StatelessWidget { ...filters, if (entry.isFavourite) FavouriteFilter.instance, ]..sort(); - if (effectiveFilters.isEmpty) return SizedBox.shrink(); + if (effectiveFilters.isEmpty) return const SizedBox.shrink(); return Padding( - padding: EdgeInsets.symmetric(horizontal: AvesFilterChip.outlineWidth / 2) + EdgeInsets.only(top: 8), + padding: const EdgeInsets.symmetric(horizontal: AvesFilterChip.outlineWidth / 2) + const EdgeInsets.only(top: 8), child: Wrap( spacing: 8, runSpacing: 8, @@ -151,7 +151,7 @@ class _OwnerPropState extends State { future: _ownerPackageFuture, builder: (context, snapshot) { final ownerPackage = snapshot.data; - if (ownerPackage == null) return SizedBox(); + if (ownerPackage == null) return const SizedBox(); final appName = androidFileUtils.getCurrentAppName(ownerPackage) ?? ownerPackage; // as of Flutter v1.22.6, `SelectableText` cannot contain `WidgetSpan` // so we use a basic `Text` instead @@ -168,7 +168,7 @@ class _OwnerPropState extends State { WidgetSpan( alignment: PlaceholderAlignment.middle, child: Padding( - padding: EdgeInsets.symmetric(horizontal: 4), + padding: const EdgeInsets.symmetric(horizontal: 4), child: Image( image: AppIconImage( packageName: ownerPackage, diff --git a/lib/widgets/viewer/info/common.dart b/lib/widgets/viewer/info/common.dart index 3416c3eca..2472d9610 100644 --- a/lib/widgets/viewer/info/common.dart +++ b/lib/widgets/viewer/info/common.dart @@ -13,7 +13,7 @@ class SectionRow extends StatelessWidget { @override Widget build(BuildContext context) { const dim = 32.0; - Widget buildDivider() => SizedBox( + Widget buildDivider() => const SizedBox( width: dim, child: Divider( thickness: AvesFilterChip.outlineWidth, @@ -25,7 +25,7 @@ class SectionRow extends StatelessWidget { children: [ buildDivider(), Padding( - padding: EdgeInsets.all(16), + padding: const EdgeInsets.all(16), child: Icon( icon, size: dim, @@ -45,7 +45,7 @@ class InfoRowGroup extends StatefulWidget { static const keyValuePadding = 16; static const linkColor = Colors.blue; static const fontSize = 13.0; - static final baseStyle = TextStyle(fontSize: fontSize); + static const baseStyle = TextStyle(fontSize: fontSize); static final keyStyle = baseStyle.copyWith(color: Colors.white70, height: 2.0); static final linkStyle = baseStyle.copyWith(color: linkColor, decoration: TextDecoration.underline); @@ -70,7 +70,7 @@ class _InfoRowGroupState extends State { @override Widget build(BuildContext context) { - if (keyValues.isEmpty) return SizedBox.shrink(); + if (keyValues.isEmpty) return const SizedBox.shrink(); // compute the size of keys and space in order to align values final textScaleFactor = MediaQuery.textScaleFactorOf(context); @@ -143,7 +143,7 @@ class _InfoRowGroupState extends State { span, textDirection: TextDirection.ltr, textScaleFactor: textScaleFactor, - )..layout(BoxConstraints(), parentUsesSize: true); + )..layout(const BoxConstraints(), parentUsesSize: true); return para.getMaxIntrinsicWidth(double.infinity); } } diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart index 4c402b17f..8e931288a 100644 --- a/lib/widgets/viewer/info/info_app_bar.dart +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -21,8 +21,8 @@ class InfoAppBar extends StatelessWidget { Widget build(BuildContext context) { return SliverAppBar( leading: IconButton( - key: Key('back-button'), - icon: Icon(AIcons.goUp), + key: const Key('back-button'), + icon: const Icon(AIcons.goUp), onPressed: onBackPressed, tooltip: context.l10n.viewerInfoBackToViewerTooltip, ), @@ -32,7 +32,7 @@ class InfoAppBar extends StatelessWidget { ), actions: [ IconButton( - icon: Icon(AIcons.search), + icon: const Icon(AIcons.search), onPressed: () => _goToSearch(context), tooltip: MaterialLocalizations.of(context).searchFieldLabel, ), diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart index 69db8b66d..2bf631398 100644 --- a/lib/widgets/viewer/info/info_page.dart +++ b/lib/widgets/viewer/info/info_page.dart @@ -67,7 +67,7 @@ class _InfoPageState extends State { split: mqWidth > 600, goToViewer: _goToViewer, ) - : SizedBox.shrink(); + : const SizedBox.shrink(); }, ); }, @@ -114,7 +114,7 @@ class _InfoPageState extends State { Navigator.push( context, TransparentMaterialPageRoute( - settings: RouteSettings(name: EntryViewerPage.routeName), + settings: const RouteSettings(name: EntryViewerPage.routeName), pageBuilder: (c, a, sa) => EntryViewerPage( initialEntry: tempEntry, ), @@ -175,7 +175,7 @@ class _InfoPageContentState extends State<_InfoPageContent> { crossAxisAlignment: CrossAxisAlignment.start, children: [ Expanded(child: basicSection), - SizedBox(width: 8), + const SizedBox(width: 8), Expanded(child: locationSection), ], ), @@ -202,11 +202,11 @@ class _InfoPageContentState extends State<_InfoPageContent> { onBackPressed: widget.goToViewer, ), SliverPadding( - padding: horizontalPadding + EdgeInsets.only(top: 8), + padding: horizontalPadding + const EdgeInsets.only(top: 8), sliver: basicAndLocationSliver, ), SliverPadding( - padding: horizontalPadding + EdgeInsets.only(bottom: 8), + padding: horizontalPadding + const EdgeInsets.only(bottom: 8), sliver: metadataSliver, ), BottomPaddingSliver(), diff --git a/lib/widgets/viewer/info/info_search.dart b/lib/widgets/viewer/info/info_search.dart index 207793caa..6bc972e68 100644 --- a/lib/widgets/viewer/info/info_search.dart +++ b/lib/widgets/viewer/info/info_search.dart @@ -41,7 +41,7 @@ class InfoSearchDelegate extends SearchDelegate { return [ if (query.isNotEmpty) IconButton( - icon: Icon(AIcons.clear), + icon: const Icon(AIcons.clear), onPressed: () { query = ''; showSuggestions(context); @@ -78,7 +78,7 @@ class InfoSearchDelegate extends SearchDelegate { Widget buildResults(BuildContext context) { if (query.isEmpty) { showSuggestions(context); - return SizedBox(); + return const SizedBox(); } final queryParts = query.toUpperCase().split(' ')..removeWhere((s) => s.isEmpty); @@ -118,7 +118,7 @@ class InfoSearchDelegate extends SearchDelegate { return true; }, child: ListView.builder( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), itemBuilder: (context, index) => tiles[index], itemCount: tiles.length, ), @@ -130,7 +130,7 @@ class InfoSearchDelegate extends SearchDelegate { Navigator.push( context, TransparentMaterialPageRoute( - settings: RouteSettings(name: EntryViewerPage.routeName), + settings: const RouteSettings(name: EntryViewerPage.routeName), pageBuilder: (c, a, sa) => EntryViewerPage( initialEntry: tempEntry, ), diff --git a/lib/widgets/viewer/info/location_section.dart b/lib/widgets/viewer/info/location_section.dart index 68915e718..8084580bd 100644 --- a/lib/widgets/viewer/info/location_section.dart +++ b/lib/widgets/viewer/info/location_section.dart @@ -84,7 +84,7 @@ class _LocationSectionState extends State with TickerProviderSt @override Widget build(BuildContext context) { - if (!entry.hasGps) return SizedBox(); + if (!entry.hasGps) return const SizedBox(); final latLng = entry.latLng!; final geoUri = entry.geoUri!; @@ -106,11 +106,11 @@ class _LocationSectionState extends State with TickerProviderSt return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (widget.showTitle) SectionRow(AIcons.location), + if (widget.showTitle) const SectionRow(AIcons.location), FutureBuilder( future: availability.isConnected, builder: (context, snapshot) { - if (snapshot.data != true) return SizedBox(); + if (snapshot.data != true) return const SizedBox(); return Selector( selector: (context, s) => s.infoMapStyle, builder: (context, mapStyle, child) { @@ -130,7 +130,7 @@ class _LocationSectionState extends State with TickerProviderSt visible: !isGoogleMaps || _googleMapsLoaded, replacement: Stack( children: [ - MapDecorator(), + const MapDecorator(), MapButtonPanel( geoUri: geoUri, zoomBy: (_) {}, @@ -169,7 +169,7 @@ class _LocationSectionState extends State with TickerProviderSt _AddressInfoGroup(entry: entry), if (filters.isNotEmpty) Padding( - padding: EdgeInsets.symmetric(horizontal: AvesFilterChip.outlineWidth / 2) + EdgeInsets.only(top: 8), + padding: const EdgeInsets.symmetric(horizontal: AvesFilterChip.outlineWidth / 2) + const EdgeInsets.only(top: 8), child: Wrap( spacing: 8, runSpacing: 8, diff --git a/lib/widgets/viewer/info/maps/common.dart b/lib/widgets/viewer/info/maps/common.dart index 8041ec0a2..696e09ddd 100644 --- a/lib/widgets/viewer/info/maps/common.dart +++ b/lib/widgets/viewer/info/maps/common.dart @@ -37,7 +37,7 @@ class MapDecorator extends StatelessWidget { height: 200, child: Stack( children: [ - GridPaper( + const GridPaper( color: mapLoadingGrid, interval: 10, divisions: 1, @@ -72,7 +72,7 @@ class MapButtonPanel extends StatelessWidget { child: Align( alignment: AlignmentDirectional.centerEnd, child: Padding( - padding: EdgeInsets.all(padding), + padding: const EdgeInsets.all(padding), child: TooltipTheme( data: TooltipTheme.of(context).copyWith( preferBelow: false, @@ -87,7 +87,7 @@ class MapButtonPanel extends StatelessWidget { }), tooltip: context.l10n.entryActionOpenMap, ), - SizedBox(height: padding), + const SizedBox(height: padding), MapOverlayButton( icon: AIcons.layers, onPressed: () async { @@ -113,13 +113,13 @@ class MapButtonPanel extends StatelessWidget { }, tooltip: context.l10n.viewerInfoMapStyleTooltip, ), - Spacer(), + const Spacer(), MapOverlayButton( icon: AIcons.zoomIn, onPressed: () => zoomBy(1), tooltip: context.l10n.viewerInfoMapZoomInTooltip, ), - SizedBox(height: padding), + const SizedBox(height: padding), MapOverlayButton( icon: AIcons.zoomOut, onPressed: () => zoomBy(-1), diff --git a/lib/widgets/viewer/info/maps/leaflet_map.dart b/lib/widgets/viewer/info/maps/leaflet_map.dart index 12a19023b..8b47d6be5 100644 --- a/lib/widgets/viewer/info/maps/leaflet_map.dart +++ b/lib/widgets/viewer/info/maps/leaflet_map.dart @@ -104,7 +104,7 @@ class _EntryLeafletMapState extends State with TickerProviderSt case EntryMapStyle.stamenWatercolor: return StamenWatercolorLayer(); default: - return SizedBox.shrink(); + return const SizedBox.shrink(); } } @@ -116,19 +116,19 @@ class _EntryLeafletMapState extends State with TickerProviderSt case EntryMapStyle.stamenWatercolor: return _buildAttributionMarkdown(context.l10n.mapAttributionStamen); default: - return SizedBox.shrink(); + return const SizedBox.shrink(); } } Widget _buildAttributionMarkdown(String data) { return Padding( - padding: EdgeInsets.only(top: 4), + padding: const EdgeInsets.only(top: 4), child: MarkdownBody( data: data, selectable: true, styleSheet: MarkdownStyleSheet( a: TextStyle(color: Theme.of(context).accentColor), - p: TextStyle(color: Colors.white70, fontSize: InfoRowGroup.fontSize), + p: const TextStyle(color: Colors.white70, fontSize: InfoRowGroup.fontSize), ), onTapLink: (text, href, title) async { if (href != null && await canLaunch(href)) { diff --git a/lib/widgets/viewer/info/maps/scale_layer.dart b/lib/widgets/viewer/info/maps/scale_layer.dart index 5a0a1e6bf..e8805975a 100644 --- a/lib/widgets/viewer/info/maps/scale_layer.dart +++ b/lib/widgets/viewer/info/maps/scale_layer.dart @@ -32,7 +32,7 @@ class ScaleLayerWidget extends StatelessWidget { @override Widget build(BuildContext context) { final mapState = MapState.maybeOf(context); - return mapState != null ? ScaleLayer(options, mapState, mapState.onMoved) : SizedBox(); + return mapState != null ? ScaleLayer(options, mapState, mapState.onMoved) : const SizedBox(); } } @@ -112,14 +112,14 @@ class ScaleBar extends StatelessWidget { Widget build(BuildContext context) { return Container( alignment: AlignmentDirectional.bottomStart, - padding: EdgeInsets.symmetric(vertical: 8, horizontal: 16), + padding: const EdgeInsets.symmetric(vertical: 8, horizontal: 16), child: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ OutlinedText( text: distance, - style: TextStyle( + style: const TextStyle( color: fillColor, fontSize: 11, ), @@ -129,13 +129,13 @@ class ScaleBar extends StatelessWidget { Container( height: barThickness + outlineWidth * 2, width: width, - decoration: BoxDecoration( + decoration: const BoxDecoration( color: fillColor, - border: Border.all( + border: Border.fromBorderSide(BorderSide( color: outlineColor, width: outlineWidth, - ), - borderRadius: BorderRadius.circular(8), + )), + borderRadius: BorderRadius.all(Radius.circular(8)), ), ), ], diff --git a/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart index da9220fdf..1e9aff201 100644 --- a/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart +++ b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart @@ -41,7 +41,7 @@ class MetadataDirTile extends StatelessWidget with FeedbackMixin { @override Widget build(BuildContext context) { final tags = dir.tags; - if (tags.isEmpty) return SizedBox.shrink(); + if (tags.isEmpty) return const SizedBox.shrink(); final dirName = dir.name; Widget tile; @@ -71,7 +71,7 @@ class MetadataDirTile extends StatelessWidget with FeedbackMixin { children: [ if (showThumbnails && dirName == MetadataDirectory.exifThumbnailDirectory) MetadataThumbnails(entry: entry), Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: InfoRowGroup( tags, maxValueLength: Constants.infoGroupMaxValueLength, @@ -98,7 +98,7 @@ class MetadataDirTile extends StatelessWidget with FeedbackMixin { Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: SourceViewerPage.routeName), + settings: const RouteSettings(name: SourceViewerPage.routeName), builder: (context) => SourceViewerPage( loader: () => SynchronousFuture(tags['Metadata'] ?? ''), ), diff --git a/lib/widgets/viewer/info/metadata/metadata_section.dart b/lib/widgets/viewer/info/metadata/metadata_section.dart index c4c393cbf..c4134dd5e 100644 --- a/lib/widgets/viewer/info/metadata/metadata_section.dart +++ b/lib/widgets/viewer/info/metadata/metadata_section.dart @@ -87,7 +87,7 @@ class _MetadataSectionSliverState extends State { builder: (context, metadata, child) { Widget content; if (metadata.isEmpty) { - content = SizedBox.shrink(); + content = const SizedBox.shrink(); } else { content = Column( children: AnimationConfiguration.toStaggeredList( @@ -100,7 +100,7 @@ class _MetadataSectionSliverState extends State { ), ), children: [ - SectionRow(AIcons.info), + const SectionRow(AIcons.info), ...metadata.entries.map((kv) => MetadataDirTile( entry: entry, title: kv.key, diff --git a/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart b/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart index eef9a8f92..0df49a5c2 100644 --- a/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart +++ b/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart @@ -39,7 +39,7 @@ class _MetadataThumbnailsState extends State { if (!snapshot.hasError && snapshot.connectionState == ConnectionState.done && snapshot.data!.isNotEmpty) { return Container( alignment: AlignmentDirectional.topStart, - padding: EdgeInsets.only(left: 8, top: 8, right: 8, bottom: 4), + padding: const EdgeInsets.only(left: 8, top: 8, right: 8, bottom: 4), child: Wrap( children: snapshot.data!.map((bytes) { return Image.memory( @@ -50,7 +50,7 @@ class _MetadataThumbnailsState extends State { ), ); } - return SizedBox.shrink(); + return const SizedBox.shrink(); }); } } diff --git a/lib/widgets/viewer/info/metadata/xmp_namespaces.dart b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart index 1708496d0..4856b63a6 100644 --- a/lib/widgets/viewer/info/metadata/xmp_namespaces.dart +++ b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart @@ -81,7 +81,7 @@ class XmpNamespace { ? [ if (displayTitle.isNotEmpty) Padding( - padding: EdgeInsets.only(top: 8), + padding: const EdgeInsets.only(top: 8), child: HighlightTitle( displayTitle, color: BrandColors.get(displayTitle), diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/google.dart b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart index fe5d3461d..ba305f4bf 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/google.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart @@ -41,7 +41,7 @@ class XmpGAudioNamespace extends XmpGoogleNamespace { XmpGAudioNamespace(Map rawProps) : super(ns, rawProps); @override - List> get dataProps => [Tuple2('$ns:Data', '$ns:Mime')]; + List> get dataProps => const [Tuple2('$ns:Data', '$ns:Mime')]; @override String get displayTitle => 'Google Audio'; @@ -53,7 +53,7 @@ class XmpGDepthNamespace extends XmpGoogleNamespace { XmpGDepthNamespace(Map rawProps) : super(ns, rawProps); @override - List> get dataProps => [ + List> get dataProps => const [ Tuple2('$ns:Data', '$ns:Mime'), Tuple2('$ns:Confidence', '$ns:ConfidenceMime'), ]; @@ -68,7 +68,7 @@ class XmpGImageNamespace extends XmpGoogleNamespace { XmpGImageNamespace(Map rawProps) : super(ns, rawProps); @override - List> get dataProps => [Tuple2('$ns:Data', '$ns:Mime')]; + List> get dataProps => const [Tuple2('$ns:Data', '$ns:Mime')]; @override String get displayTitle => 'Google Image'; @@ -89,7 +89,7 @@ class XmpGCameraNamespace extends XmpNamespace { Map get buildProps { return _isMotionPhoto ? Map.fromEntries({ - MapEntry(videoDataKey, '[skipped]'), + const MapEntry(videoDataKey, '[skipped]'), ...rawProps.entries, }) : rawProps; diff --git a/lib/widgets/viewer/info/metadata/xmp_structs.dart b/lib/widgets/viewer/info/metadata/xmp_structs.dart index 8f3cf6537..aaff62184 100644 --- a/lib/widgets/viewer/info/metadata/xmp_structs.dart +++ b/lib/widgets/viewer/info/metadata/xmp_structs.dart @@ -57,7 +57,7 @@ class _XmpStructArrayCardState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( - padding: EdgeInsets.only(left: 8, top: 8, right: 8), + padding: const EdgeInsets.only(left: 8, top: 8, right: 8), child: Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ @@ -70,13 +70,13 @@ class _XmpStructArrayCardState extends State { ), IconButton( visualDensity: VisualDensity.compact, - icon: Icon(AIcons.previous), + icon: const Icon(AIcons.previous), onPressed: _index > 0 ? () => setIndex(_index - 1) : null, tooltip: context.l10n.previousTooltip, ), IconButton( visualDensity: VisualDensity.compact, - icon: Icon(AIcons.next), + icon: const Icon(AIcons.next), onPressed: _index < structs.length - 1 ? () => setIndex(_index + 1) : null, tooltip: context.l10n.nextTooltip, ), @@ -91,7 +91,7 @@ class _XmpStructArrayCardState extends State { // add padding at this level (instead of the column level) // so that the crossfader can animate the content size // without clipping the text - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: InfoRowGroup( structs[_index], maxValueLength: Constants.infoGroupMaxValueLength, @@ -123,7 +123,7 @@ class XmpStructCard extends StatelessWidget { return Card( margin: cardMargin, child: Padding( - padding: EdgeInsets.all(8), + padding: const EdgeInsets.all(8), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/widgets/viewer/info/metadata/xmp_tile.dart b/lib/widgets/viewer/info/metadata/xmp_tile.dart index bd58a4baf..387d00531 100644 --- a/lib/widgets/viewer/info/metadata/xmp_tile.dart +++ b/lib/widgets/viewer/info/metadata/xmp_tile.dart @@ -42,7 +42,7 @@ class _XmpDirTileState extends State { initiallyExpanded: widget.initiallyExpanded, children: [ Padding( - padding: EdgeInsets.only(left: 8, right: 8, bottom: 8), + padding: const EdgeInsets.only(left: 8, right: 8, bottom: 8), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: sections.expand((section) => section.buildNamespaceSection()).toList(), diff --git a/lib/widgets/viewer/info/notifications.dart b/lib/widgets/viewer/info/notifications.dart index 3c0d422ad..54a0ccfa3 100644 --- a/lib/widgets/viewer/info/notifications.dart +++ b/lib/widgets/viewer/info/notifications.dart @@ -41,11 +41,11 @@ class OpenEmbeddedDataNotification extends Notification { this.mimeType, }); - factory OpenEmbeddedDataNotification.motionPhotoVideo() => OpenEmbeddedDataNotification._private( + factory OpenEmbeddedDataNotification.motionPhotoVideo() => const OpenEmbeddedDataNotification._private( source: EmbeddedDataSource.motionPhotoVideo, ); - factory OpenEmbeddedDataNotification.videoCover() => OpenEmbeddedDataNotification._private( + factory OpenEmbeddedDataNotification.videoCover() => const OpenEmbeddedDataNotification._private( source: EmbeddedDataSource.videoCover, ); diff --git a/lib/widgets/viewer/overlay/bottom/common.dart b/lib/widgets/viewer/overlay/bottom/common.dart index 01d1a7a6d..34ca07956 100644 --- a/lib/widgets/viewer/overlay/bottom/common.dart +++ b/lib/widgets/viewer/overlay/bottom/common.dart @@ -100,7 +100,7 @@ class _ViewerBottomOverlayState extends State { _lastDetails = snapshot.data; _lastEntry = entry; } - if (_lastEntry == null) return SizedBox.shrink(); + if (_lastEntry == null) return const SizedBox.shrink(); Widget _buildContent({MultiPageInfo? multiPageInfo, int? page}) => _BottomOverlayContent( mainEntry: _lastEntry!, @@ -168,8 +168,8 @@ class _BottomOverlayContent extends AnimatedWidget { Widget build(BuildContext context) { return DefaultTextStyle( style: Theme.of(context).textTheme.bodyText2!.copyWith( - shadows: [Constants.embossShadow], - ), + shadows: Constants.embossShadows, + ), softWrap: false, overflow: TextOverflow.fade, maxLines: 1, @@ -198,7 +198,7 @@ class _BottomOverlayContent extends AnimatedWidget { ); } - return infoColumn ?? SizedBox(); + return infoColumn ?? const SizedBox(); }, ), ), @@ -222,7 +222,7 @@ class _BottomOverlayContent extends AnimatedWidget { _buildSoloLocationRow(), if (twoColumns) Padding( - padding: EdgeInsets.only(top: _interRowPadding), + padding: const EdgeInsets.only(top: _interRowPadding), child: Row( children: [ Container( @@ -237,7 +237,7 @@ class _BottomOverlayContent extends AnimatedWidget { ) else ...[ Container( - padding: EdgeInsets.only(top: _interRowPadding), + padding: const EdgeInsets.only(top: _interRowPadding), width: subRowWidth, child: _DateRow( entry: pageEntry, @@ -258,10 +258,10 @@ class _BottomOverlayContent extends AnimatedWidget { transitionBuilder: _soloTransition, child: pageEntry.hasGps ? Container( - padding: EdgeInsets.only(top: _interRowPadding), + padding: const EdgeInsets.only(top: _interRowPadding), child: _LocationRow(entry: pageEntry), ) - : SizedBox.shrink(), + : const SizedBox.shrink(), ); Widget _buildSoloShootingRow(double subRowWidth, bool hasShootingDetails) => AnimatedSwitcher( @@ -271,11 +271,11 @@ class _BottomOverlayContent extends AnimatedWidget { transitionBuilder: _soloTransition, child: hasShootingDetails ? Container( - padding: EdgeInsets.only(top: _interRowPadding), + padding: const EdgeInsets.only(top: _interRowPadding), width: subRowWidth, child: _ShootingRow(details!), ) - : SizedBox.shrink(), + : const SizedBox.shrink(), ); Widget _buildDuoShootingRow(double subRowWidth, bool hasShootingDetails) => AnimatedSwitcher( @@ -291,7 +291,7 @@ class _BottomOverlayContent extends AnimatedWidget { width: subRowWidth, child: _ShootingRow(details!), ) - : SizedBox.shrink(), + : const SizedBox.shrink(), ); static Widget _soloTransition(Widget child, Animation animation) => FadeTransition( @@ -317,8 +317,8 @@ class _LocationRow extends AnimatedWidget { final location = entry.hasAddress ? entry.shortAddress : settings.coordinateFormat.format(entry.latLng!); return Row( children: [ - DecoratedIcon(AIcons.location, shadows: [Constants.embossShadow], size: _iconSize), - SizedBox(width: _iconPadding), + const DecoratedIcon(AIcons.location, shadows: Constants.embossShadows, size: _iconSize), + const SizedBox(width: _iconPadding), Expanded(child: Text(location, strutStyle: Constants.overflowStrutStyle)), ], ); @@ -396,8 +396,8 @@ class _DateRow extends StatelessWidget { return Row( children: [ - DecoratedIcon(AIcons.date, shadows: [Constants.embossShadow], size: _iconSize), - SizedBox(width: _iconPadding), + const DecoratedIcon(AIcons.date, shadows: Constants.embossShadows, size: _iconSize), + const SizedBox(width: _iconPadding), Expanded(flex: 3, child: Text(dateText, strutStyle: Constants.overflowStrutStyle)), Expanded(flex: 2, child: Text(resolutionText, strutStyle: Constants.overflowStrutStyle)), ], @@ -414,8 +414,8 @@ class _ShootingRow extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - DecoratedIcon(AIcons.shooting, shadows: [Constants.embossShadow], size: _iconSize), - SizedBox(width: _iconPadding), + const DecoratedIcon(AIcons.shooting, shadows: Constants.embossShadows, size: _iconSize), + const SizedBox(width: _iconPadding), Expanded(child: Text(details.aperture ?? Constants.overlayUnknown, strutStyle: Constants.overflowStrutStyle)), Expanded(child: Text(details.exposureTime ?? Constants.overlayUnknown, strutStyle: Constants.overflowStrutStyle)), Expanded(child: Text(details.focalLength ?? Constants.overlayUnknown, strutStyle: Constants.overflowStrutStyle)), @@ -445,7 +445,7 @@ class ExtraBottomOverlay extends StatelessWidget { final viewInsets = this.viewInsets ?? mqViewInsets; final viewPadding = this.viewPadding ?? mqViewPadding; - final safePadding = (viewInsets + viewPadding).copyWith(bottom: 8) + EdgeInsets.symmetric(horizontal: 8.0); + final safePadding = (viewInsets + viewPadding).copyWith(bottom: 8) + const EdgeInsets.symmetric(horizontal: 8.0); return Padding( padding: safePadding, diff --git a/lib/widgets/viewer/overlay/bottom/multipage.dart b/lib/widgets/viewer/overlay/bottom/multipage.dart index f626246b3..b0817a449 100644 --- a/lib/widgets/viewer/overlay/bottom/multipage.dart +++ b/lib/widgets/viewer/overlay/bottom/multipage.dart @@ -89,7 +89,7 @@ class _MultiPageOverlayState extends State { Widget build(BuildContext context) { final marginWidth = max(0.0, (availableWidth - extent) / 2 - separatorWidth); final horizontalMargin = SizedBox(width: marginWidth); - final separator = SizedBox(width: separatorWidth); + const separator = SizedBox(width: separatorWidth); return ThumbnailTheme( extent: extent, diff --git a/lib/widgets/viewer/overlay/bottom/panorama.dart b/lib/widgets/viewer/overlay/bottom/panorama.dart index 499a72280..861afbae2 100644 --- a/lib/widgets/viewer/overlay/bottom/panorama.dart +++ b/lib/widgets/viewer/overlay/bottom/panorama.dart @@ -20,7 +20,7 @@ class PanoramaOverlay extends StatelessWidget { Widget build(BuildContext context) { return Row( children: [ - Spacer(), + const Spacer(), OverlayTextButton( scale: scale, buttonLabel: context.l10n.viewerOpenPanoramaButtonLabel, @@ -30,7 +30,7 @@ class PanoramaOverlay extends StatelessWidget { unawaited(Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: PanoramaPage.routeName), + settings: const RouteSettings(name: PanoramaPage.routeName), builder: (context) => PanoramaPage( entry: entry, info: info, diff --git a/lib/widgets/viewer/overlay/bottom/video.dart b/lib/widgets/viewer/overlay/bottom/video.dart index fa3a80804..7ba521522 100644 --- a/lib/widgets/viewer/overlay/bottom/video.dart +++ b/lib/widgets/viewer/overlay/bottom/video.dart @@ -103,7 +103,7 @@ class _VideoControlOverlayState extends State with SingleTi OverlayButton( scale: scale, child: IconButton( - icon: Icon(AIcons.openOutside), + icon: const Icon(AIcons.openOutside), onPressed: () => AndroidAppService.open(entry.uri, entry.mimeTypeAnySubtype), tooltip: context.l10n.viewerOpenTooltip, ), @@ -113,7 +113,7 @@ class _VideoControlOverlayState extends State with SingleTi Expanded( child: _buildProgressBar(), ), - SizedBox(width: 8), + const SizedBox(width: 8), OverlayButton( scale: scale, child: IconButton( @@ -152,11 +152,11 @@ class _VideoControlOverlayState extends State with SingleTi if (_playingOnDragStart) controller!.play(); }, child: Container( - padding: EdgeInsets.symmetric(vertical: 4, horizontal: 16) + EdgeInsets.only(bottom: 16), + padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 16) + const EdgeInsets.only(bottom: 16), decoration: BoxDecoration( color: kOverlayBackgroundColor, border: AvesBorder.border, - borderRadius: BorderRadius.circular(progressBarBorderRadius), + borderRadius: const BorderRadius.all(Radius.circular(progressBarBorderRadius)), ), child: Column( key: _progressBarKey, @@ -170,12 +170,12 @@ class _VideoControlOverlayState extends State with SingleTi final position = controller?.currentPosition.floor() ?? 0; return Text(formatFriendlyDuration(Duration(milliseconds: position))); }), - Spacer(), + const Spacer(), Text(entry.durationText), ], ), ClipRRect( - borderRadius: BorderRadius.circular(4), + borderRadius: const BorderRadius.all(Radius.circular(4)), child: StreamBuilder( stream: positionStream, builder: (context, snapshot) { diff --git a/lib/widgets/viewer/overlay/common.dart b/lib/widgets/viewer/overlay/common.dart index 40a51ebfa..03b62c557 100644 --- a/lib/widgets/viewer/overlay/common.dart +++ b/lib/widgets/viewer/overlay/common.dart @@ -51,7 +51,7 @@ class OverlayTextButton extends StatelessWidget { }) : super(key: key); static const _borderRadius = 123.0; - static final _minSize = MaterialStateProperty.all(Size(kMinInteractiveDimension, kMinInteractiveDimension)); + static final _minSize = MaterialStateProperty.all(const Size(kMinInteractiveDimension, kMinInteractiveDimension)); @override Widget build(BuildContext context) { @@ -67,8 +67,8 @@ class OverlayTextButton extends StatelessWidget { overlayColor: MaterialStateProperty.all(Colors.white.withOpacity(0.12)), minimumSize: _minSize, side: MaterialStateProperty.all(AvesBorder.side), - shape: MaterialStateProperty.all(RoundedRectangleBorder( - borderRadius: BorderRadius.circular(_borderRadius), + shape: MaterialStateProperty.all(const RoundedRectangleBorder( + borderRadius: BorderRadius.all(Radius.circular(_borderRadius)), )), // shape: MaterialStateProperty.all(CircleBorder()), ), diff --git a/lib/widgets/viewer/overlay/minimap.dart b/lib/widgets/viewer/overlay/minimap.dart index f383f9979..a75c1699f 100644 --- a/lib/widgets/viewer/overlay/minimap.dart +++ b/lib/widgets/viewer/overlay/minimap.dart @@ -25,7 +25,7 @@ class Minimap extends StatelessWidget { valueListenable: viewStateNotifier, builder: (context, viewState, child) { final viewportSize = viewState.viewportSize; - if (viewportSize == null) return SizedBox.shrink(); + if (viewportSize == null) return const SizedBox.shrink(); return AnimatedBuilder( animation: entry.imageChangeNotifier, builder: (context, child) => CustomPaint( @@ -65,7 +65,7 @@ class MinimapPainter extends CustomPainter { if (viewSize.isEmpty) return; // hide minimap when image is in full view - if (viewportSize + Offset(precisionErrorTolerance, precisionErrorTolerance) >= viewSize) return; + if (viewportSize + const Offset(precisionErrorTolerance, precisionErrorTolerance) >= viewSize) return; final canvasScale = size.longestSide / viewSize.longestSide; final scaledEntrySize = viewSize * canvasScale; @@ -86,7 +86,7 @@ class MinimapPainter extends CustomPainter { final fill = Paint() ..style = PaintingStyle.fill - ..color = Color(0x33000000); + ..color = const Color(0x33000000); final minimapStroke = Paint() ..style = PaintingStyle.stroke ..color = minimapBorderColor; diff --git a/lib/widgets/viewer/overlay/top.dart b/lib/widgets/viewer/overlay/top.dart index 83bf15e3e..4e20982a2 100644 --- a/lib/widgets/viewer/overlay/top.dart +++ b/lib/widgets/viewer/overlay/top.dart @@ -43,7 +43,7 @@ class ViewerTopOverlay extends StatelessWidget { return SafeArea( minimum: (viewInsets ?? EdgeInsets.zero) + (viewPadding ?? EdgeInsets.zero), child: Padding( - padding: EdgeInsets.all(padding), + padding: const EdgeInsets.all(padding), child: Selector( selector: (c, mq) => mq.size.width - mq.padding.horizontal, builder: (c, mqWidth, child) { @@ -126,7 +126,7 @@ class ViewerTopOverlay extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ buttonRow, - SizedBox(height: 8), + const SizedBox(height: 8), FadeTransition( opacity: scale, child: Minimap( @@ -165,21 +165,21 @@ class _TopOverlayRow extends StatelessWidget { children: [ OverlayButton( scale: scale, - child: Navigator.canPop(context) ? BackButton() : CloseButton(), + child: Navigator.canPop(context) ? const BackButton() : const CloseButton(), ), - Spacer(), + const Spacer(), ...quickActions.map((action) => _buildOverlayButton(context, action)), OverlayButton( scale: scale, child: PopupMenuButton( - key: Key('entry-menu-button'), + key: const Key('entry-menu-button'), itemBuilder: (context) => [ ...inAppActions.map((action) => _buildPopupMenuItem(context, action)), if (pageEntry.canRotateAndFlip) _buildRotateAndFlipMenuItems(context), - PopupMenuDivider(), + const PopupMenuDivider(), ...externalAppActions.map((action) => _buildPopupMenuItem(context, action)), if (!kReleaseMode) ...[ - PopupMenuDivider(), + const PopupMenuDivider(), _buildPopupMenuItem(context, EntryAction.debug), ] ], @@ -228,13 +228,13 @@ class _TopOverlayRow extends StatelessWidget { } return child != null ? Padding( - padding: EdgeInsetsDirectional.only(end: padding), + padding: const EdgeInsetsDirectional.only(end: padding), child: OverlayButton( scale: scale, child: child, ), ) - : SizedBox.shrink(); + : const SizedBox.shrink(); } PopupMenuEntry _buildPopupMenuItem(BuildContext context, EntryAction action) { @@ -275,7 +275,7 @@ class _TopOverlayRow extends StatelessWidget { } PopupMenuItem _buildRotateAndFlipMenuItems(BuildContext context) { - Widget buildDivider() => SizedBox( + Widget buildDivider() => const SizedBox( height: 16, child: VerticalDivider( width: 1, @@ -372,7 +372,7 @@ class _FavouriteTogglerState extends State<_FavouriteToggler> { ), Sweeper( key: ValueKey(widget.entry), - builder: (context) => Icon(AIcons.favourite, color: Colors.redAccent), + builder: (context) => const Icon(AIcons.favourite, color: Colors.redAccent), toggledNotifier: isFavouriteNotifier, ), ], diff --git a/lib/widgets/viewer/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart index 9daab4b28..8df109ade 100644 --- a/lib/widgets/viewer/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -65,7 +65,7 @@ class _PanoramaPageState extends State { builder: (context, sensorControl, child) { return Panorama( sensorControl: sensorControl, - croppedArea: info.hasCroppedArea ? info.croppedAreaRect! : Rect.fromLTWH(0.0, 0.0, 1.0, 1.0), + croppedArea: info.hasCroppedArea ? info.croppedAreaRect! : const Rect.fromLTWH(0.0, 0.0, 1.0, 1.0), croppedFullWidth: info.hasCroppedArea ? info.fullPanoSize!.width : 1.0, croppedFullHeight: info.hasCroppedArea ? info.fullPanoSize!.height : 1.0, onTap: (longitude, latitude, tilt) => _overlayVisible.value = !_overlayVisible.value, @@ -92,7 +92,7 @@ class _PanoramaPageState extends State { selector: (c, mq) => mq.viewPadding + mq.viewInsets, builder: (c, mqPadding, child) { return Padding( - padding: EdgeInsets.all(8) + EdgeInsets.only(right: mqPadding.right, bottom: mqPadding.bottom), + padding: const EdgeInsets.all(8) + EdgeInsets.only(right: mqPadding.right, bottom: mqPadding.bottom), child: OverlayButton( child: ValueListenableBuilder( valueListenable: _sensorControl, diff --git a/lib/widgets/viewer/source_viewer_page.dart b/lib/widgets/viewer/source_viewer_page.dart index 41f4d3113..17be3a598 100644 --- a/lib/widgets/viewer/source_viewer_page.dart +++ b/lib/widgets/viewer/source_viewer_page.dart @@ -36,21 +36,21 @@ class _SourceViewerPageState extends State { future: _loader, builder: (context, snapshot) { if (snapshot.hasError) return Text(snapshot.error.toString()); - if (!snapshot.hasData) return SizedBox.shrink(); + if (!snapshot.hasData) return const SizedBox.shrink(); final source = snapshot.data!; final highlightView = AvesHighlightView( source, language: 'xml', theme: darculaTheme, - padding: EdgeInsets.all(8), - textStyle: TextStyle( + padding: const EdgeInsets.all(8), + textStyle: const TextStyle( fontSize: 12, ), tabSize: 4, ); return Container( - constraints: BoxConstraints.expand(), + constraints: const BoxConstraints.expand(), child: Scrollbar( child: SingleChildScrollView( child: SingleChildScrollView( diff --git a/lib/widgets/viewer/video/fijkplayer.dart b/lib/widgets/viewer/video/fijkplayer.dart index 27efb7d20..b2e830b26 100644 --- a/lib/widgets/viewer/video/fijkplayer.dart +++ b/lib/widgets/viewer/video/fijkplayer.dart @@ -25,7 +25,7 @@ class IjkPlayerAvesVideoController extends AvesVideoController { final ValueNotifier _selectedVideoStream = ValueNotifier(null); final ValueNotifier _selectedAudioStream = ValueNotifier(null); final ValueNotifier _selectedTextStream = ValueNotifier(null); - final ValueNotifier> _sar = ValueNotifier(Tuple2(1, 1)); + final ValueNotifier> _sar = ValueNotifier(const Tuple2(1, 1)); Timer? _initialPlayTimer; Stream get _valueStream => _valueStreamController.stream; @@ -59,7 +59,7 @@ class IjkPlayerAvesVideoController extends AvesVideoController { } Future _init({int startMillis = 0}) async { - _sar.value = Tuple2(1, 1); + _sar.value = const Tuple2(1, 1); _applyOptions(startMillis); // calling `setDataSource()` with `autoPlay` starts as soon as possible, but often yields initial artifacts @@ -249,7 +249,7 @@ class IjkPlayerAvesVideoController extends AvesVideoController { alignment: _alignmentForRotation(entry.rotationDegrees), macroBlockCrop: _macroBlockCrop, ), - panelBuilder: (player, data, context, viewSize, texturePos) => SizedBox(), + panelBuilder: (player, data, context, viewSize, texturePos) => const SizedBox(), color: Colors.transparent, ); }); diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index aa9d51d27..48f12d762 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -166,7 +166,7 @@ class _EntryPageViewState extends State { final colorFilter = background.isColor ? ColorFilter.mode(background.color, BlendMode.dstOver) : null; var child = _buildMagnifier( - maxScale: ScaleLevel(factor: double.infinity), + maxScale: const ScaleLevel(factor: double.infinity), scaleStateCycle: _vectorScaleStateCycle, child: SvgPicture( UriPicture( @@ -189,7 +189,7 @@ class _EntryPageViewState extends State { Widget _buildVideoView() { final videoController = context.read().getController(entry); - if (videoController == null) return SizedBox(); + if (videoController == null) return const SizedBox(); return Stack( fit: StackFit.expand, children: [ diff --git a/lib/widgets/viewer/visual/error.dart b/lib/widgets/viewer/visual/error.dart index 54f480fdf..9d72b010e 100644 --- a/lib/widgets/viewer/visual/error.dart +++ b/lib/widgets/viewer/visual/error.dart @@ -42,7 +42,7 @@ class _ErrorViewState extends State { child: FutureBuilder( future: _exists, builder: (context, snapshot) { - if (snapshot.connectionState != ConnectionState.done) return SizedBox(); + if (snapshot.connectionState != ConnectionState.done) return const SizedBox(); final exists = snapshot.data!; return EmptyContent( icon: exists ? AIcons.error : AIcons.broken, diff --git a/lib/widgets/viewer/visual/raster.dart b/lib/widgets/viewer/visual/raster.dart index 6aee3b005..e246eaa4c 100644 --- a/lib/widgets/viewer/visual/raster.dart +++ b/lib/widgets/viewer/visual/raster.dart @@ -161,7 +161,7 @@ class _RasterImageViewState extends State { return ValueListenableBuilder( valueListenable: _fullImageLoaded, builder: (context, fullImageLoaded, child) { - if (fullImageLoaded) return SizedBox.shrink(); + if (fullImageLoaded) return const SizedBox.shrink(); return Center( child: AspectRatio( @@ -182,7 +182,7 @@ class _RasterImageViewState extends State { final viewSize = _displaySize * viewState.scale!; final decorationOffset = ((viewSize - viewportSize) as Offset) / 2 - viewState.position; // deflate as a quick way to prevent background bleed - final decorationSize = (applyBoxFit(BoxFit.none, viewSize, viewportSize).source - Offset(.5, .5)) as Size; + final decorationSize = (applyBoxFit(BoxFit.none, viewSize, viewportSize).source - const Offset(.5, .5)) as Size; Widget child; final background = settings.rasterBackground; @@ -193,7 +193,7 @@ class _RasterImageViewState extends State { child = ValueListenableBuilder( valueListenable: _fullImageLoaded, builder: (context, fullImageLoaded, child) { - if (!fullImageLoaded) return SizedBox.shrink(); + if (!fullImageLoaded) return const SizedBox.shrink(); return CustomPaint( painter: CheckeredPainter( diff --git a/lib/widgets/viewer/visual/video.dart b/lib/widgets/viewer/visual/video.dart index f2ad00b7e..ec17a12e4 100644 --- a/lib/widgets/viewer/visual/video.dart +++ b/lib/widgets/viewer/visual/video.dart @@ -53,7 +53,7 @@ class _VideoViewState extends State { return StreamBuilder( stream: controller.statusStream, builder: (context, snapshot) { - return controller.isReady ? controller.buildPlayerWidget(context) : SizedBox(); + return controller.isReady ? controller.buildPlayerWidget(context) : const SizedBox(); }); } diff --git a/lib/widgets/welcome_page.dart b/lib/widgets/welcome_page.dart index a83af8490..249a235eb 100644 --- a/lib/widgets/welcome_page.dart +++ b/lib/widgets/welcome_page.dart @@ -37,11 +37,11 @@ class _WelcomePageState extends State { body: SafeArea( child: Container( alignment: Alignment.center, - padding: EdgeInsets.all(16.0), + padding: const EdgeInsets.all(16.0), child: FutureBuilder( future: _termsLoader, builder: (context, snapshot) { - if (snapshot.hasError || snapshot.connectionState != ConnectionState.done) return SizedBox.shrink(); + if (snapshot.hasError || snapshot.connectionState != ConnectionState.done) return const SizedBox.shrink(); final terms = snapshot.data!; return Column( mainAxisSize: MainAxisSize.min, @@ -57,7 +57,7 @@ class _WelcomePageState extends State { children: [ ..._buildTop(context), Flexible(child: _buildTerms(terms)), - SizedBox(height: 16), + const SizedBox(height: 16), ..._buildBottomControls(context), ], ), @@ -78,21 +78,21 @@ class _WelcomePageState extends State { return [ ...(context.select((mq) => mq.orientation) == Orientation.portrait ? [ - AvesLogo(size: 64), - SizedBox(height: 16), + const AvesLogo(size: 64), + const SizedBox(height: 16), message, ] : [ Row( mainAxisSize: MainAxisSize.min, children: [ - AvesLogo(size: 48), - SizedBox(width: 16), + const AvesLogo(size: 48), + const SizedBox(width: 16), message, ], ) ]), - SizedBox(height: 16), + const SizedBox(height: 16), ]; } @@ -108,7 +108,7 @@ class _WelcomePageState extends State { text: context.l10n.welcomeAnalyticsToggle, ), LabeledCheckbox( - key: Key('agree-checkbox'), + key: const Key('agree-checkbox'), value: _hasAcceptedTerms, onChanged: (v) { if (v != null) setState(() => _hasAcceptedTerms = v); @@ -119,15 +119,15 @@ class _WelcomePageState extends State { ); final button = ElevatedButton( - key: Key('continue-button'), + key: const Key('continue-button'), onPressed: _hasAcceptedTerms ? () { settings.hasAcceptedTerms = true; Navigator.pushReplacement( context, MaterialPageRoute( - settings: RouteSettings(name: HomePage.routeName), - builder: (context) => HomePage(), + settings: const RouteSettings(name: HomePage.routeName), + builder: (context) => const HomePage(), ), ); } @@ -145,7 +145,7 @@ class _WelcomePageState extends State { crossAxisAlignment: CrossAxisAlignment.end, children: [ checkboxes, - Spacer(), + const Spacer(), button, ], ), @@ -154,16 +154,16 @@ class _WelcomePageState extends State { Widget _buildTerms(String terms) { return Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(16), + decoration: const BoxDecoration( + borderRadius: BorderRadius.all(Radius.circular(16)), color: Colors.white10, ), - constraints: BoxConstraints(maxWidth: 460), + constraints: const BoxConstraints(maxWidth: 460), child: ClipRRect( - borderRadius: BorderRadius.circular(16), + borderRadius: const BorderRadius.all(Radius.circular(16)), child: Theme( data: Theme.of(context).copyWith( - scrollbarTheme: ScrollbarThemeData( + scrollbarTheme: const ScrollbarThemeData( radius: Radius.circular(16), crossAxisMargin: 6, mainAxisMargin: 16, diff --git a/test/fake/storage_service.dart b/test/fake/storage_service.dart index cc494fe26..e92b3460f 100644 --- a/test/fake/storage_service.dart +++ b/test/fake/storage_service.dart @@ -12,14 +12,14 @@ class FakeStorageService extends Fake implements StorageService { @override Future> getStorageVolumes() => SynchronousFuture({ - StorageVolume( + const StorageVolume( path: primaryPath, description: primaryDescription, isPrimary: true, isRemovable: false, state: 'fake', ), - StorageVolume( + const StorageVolume( path: removablePath, description: removableDescription, isPrimary: false, diff --git a/test/model/collection_source_test.dart b/test/model/collection_source_test.dart index 069a3e54c..b2caa0fe7 100644 --- a/test/model/collection_source_test.dart +++ b/test/model/collection_source_test.dart @@ -94,7 +94,7 @@ void main() { expect(source.rawAlbums.length, 1); expect(covers.count, 0); - final albumFilter = AlbumFilter(testAlbum, 'whatever'); + const albumFilter = AlbumFilter(testAlbum, 'whatever'); expect(albumFilter.test(image1), true); expect(covers.count, 0); expect(covers.coverContentId(albumFilter), null); @@ -116,7 +116,7 @@ void main() { final source = await _initSource(); await image1.toggleFavourite(); - final albumFilter = AlbumFilter(testAlbum, 'whatever'); + const albumFilter = AlbumFilter(testAlbum, 'whatever'); await covers.set(albumFilter, image1.contentId); await source.renameEntry(image1, 'image1b.jpg'); @@ -154,8 +154,8 @@ void main() { expect(source.rawAlbums.contains(sourceAlbum), true); expect(source.rawAlbums.contains(destinationAlbum), false); - final sourceAlbumFilter = AlbumFilter(sourceAlbum, 'whatever'); - final destinationAlbumFilter = AlbumFilter(destinationAlbum, 'whatever'); + const sourceAlbumFilter = AlbumFilter(sourceAlbum, 'whatever'); + const destinationAlbumFilter = AlbumFilter(destinationAlbum, 'whatever'); expect(sourceAlbumFilter.test(image1), true); expect(destinationAlbumFilter.test(image1), false); @@ -205,7 +205,7 @@ void main() { final source = await _initSource(); expect(source.rawAlbums.length, 1); - final sourceAlbumFilter = AlbumFilter(sourceAlbum, 'whatever'); + const sourceAlbumFilter = AlbumFilter(sourceAlbum, 'whatever'); await covers.set(sourceAlbumFilter, image1.contentId); await source.updateAfterMove( @@ -230,14 +230,14 @@ void main() { final source = await _initSource(); await image1.toggleFavourite(); - var albumFilter = AlbumFilter(sourceAlbum, 'whatever'); + var albumFilter = const AlbumFilter(sourceAlbum, 'whatever'); await covers.set(albumFilter, image1.contentId); await source.renameAlbum(sourceAlbum, destinationAlbum, { image1 }, { FakeMediaStoreService.moveOpEventFor(image1, sourceAlbum, destinationAlbum), }); - albumFilter = AlbumFilter(destinationAlbum, 'whatever'); + albumFilter = const AlbumFilter(destinationAlbum, 'whatever'); expect(favourites.count, 1); expect(image1.isFavourite, true); @@ -274,7 +274,7 @@ void main() { expect(source.getAlbumDisplayName(context, '${FakeStorageService.primaryPath}Seneca'), 'Seneca'); expect(source.getAlbumDisplayName(context, '${FakeStorageService.removablePath}Pictures/Cicero'), 'Cicero'); expect(source.getAlbumDisplayName(context, '${FakeStorageService.removablePath}Marcus Aurelius'), 'Marcus Aurelius'); - return Placeholder(); + return const Placeholder(); }, ), ); diff --git a/test/model/filters_test.dart b/test/model/filters_test.dart index f5271b933..9f475817d 100644 --- a/test/model/filters_test.dart +++ b/test/model/filters_test.dart @@ -13,7 +13,7 @@ void main() { test('Filter serialization', () { CollectionFilter jsonRoundTrip(filter) => CollectionFilter.fromJson(filter.toJson()); - final album = AlbumFilter('path/to/album', 'album'); + const album = AlbumFilter('path/to/album', 'album'); expect(album, jsonRoundTrip(album)); const fav = FavouriteFilter.instance; diff --git a/test_driver/app.dart b/test_driver/app.dart index 9afd4d268..34dab6200 100644 --- a/test_driver/app.dart +++ b/test_driver/app.dart @@ -27,7 +27,7 @@ Future configureAndLaunch() async { await settings.init(); settings.keepScreenOn = KeepScreenOn.always; settings.hasAcceptedTerms = false; - settings.locale = Locale('en'); + settings.locale = const Locale('en'); settings.homePage = HomePageSetting.collection; app.main(); diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart index ce6a066b8..13f442cde 100644 --- a/test_driver/app_test.dart +++ b/test_driver/app_test.dart @@ -44,23 +44,23 @@ void main() { scrollOffImage(); test('contemplation', () async { - await Future.delayed(Duration(seconds: 5)); + await Future.delayed(const Duration(seconds: 5)); }); - }, timeout: Timeout(Duration(seconds: 30))); + }, timeout: const Timeout(Duration(seconds: 30))); } void agreeToTerms() { test('[welcome] agree to terms', () async { - await driver.scroll(find.text('Terms of Service'), 0, -300, Duration(milliseconds: 500)); + await driver.scroll(find.text('Terms of Service'), 0, -300, const Duration(milliseconds: 500)); await driver.tap(find.byValueKey('agree-checkbox')); - await Future.delayed(Duration(seconds: 1)); + await Future.delayed(const Duration(seconds: 1)); await driver.tap(find.byValueKey('continue-button')); await driver.waitUntilNoTransientCallbacks(); // wait for collection loading - await driver.waitForCondition(NoPendingPlatformMessages()); + await driver.waitForCondition(const NoPendingPlatformMessages()); }); } @@ -125,7 +125,7 @@ void selectFirstAlbum() { await driver.waitUntilNoTransientCallbacks(); // wait for collection loading - await driver.waitForCondition(NoPendingPlatformMessages()); + await driver.waitForCondition(const NoPendingPlatformMessages()); await driver.tap(find.descendant( of: find.byValueKey('filter-grid-page'), @@ -161,15 +161,15 @@ void showViewer() { firstMatchOnly: true, )); await driver.waitUntilNoTransientCallbacks(); - await Future.delayed(Duration(seconds: 2)); + await Future.delayed(const Duration(seconds: 2)); }); } void goToNextImage() { test('[viewer] show next image', () async { final horizontalPageView = find.byValueKey('horizontal-pageview'); - await driver.scroll(horizontalPageView, -600, 0, Duration(milliseconds: 400)); - await Future.delayed(Duration(seconds: 2)); + await driver.scroll(horizontalPageView, -600, 0, const Duration(milliseconds: 400)); + await Future.delayed(const Duration(seconds: 2)); }); } @@ -179,11 +179,11 @@ void toggleOverlay() { print('* hide overlay'); await driver.tap(imageView); - await Future.delayed(Duration(seconds: 1)); + await Future.delayed(const Duration(seconds: 1)); print('* show overlay'); await driver.tap(imageView); - await Future.delayed(Duration(seconds: 1)); + await Future.delayed(const Duration(seconds: 1)); }); } @@ -192,13 +192,13 @@ void zoom() { final imageView = find.byValueKey('imageview'); await driver.doubleTap(imageView); - await Future.delayed(Duration(seconds: 1)); + await Future.delayed(const Duration(seconds: 1)); await driver.doubleTap(imageView); - await Future.delayed(Duration(seconds: 1)); + await Future.delayed(const Duration(seconds: 1)); await driver.doubleTap(imageView); - await Future.delayed(Duration(seconds: 1)); + await Future.delayed(const Duration(seconds: 1)); }); } @@ -207,12 +207,12 @@ void showInfoMetadata() { final verticalPageView = find.byValueKey('vertical-pageview'); print('* scroll down to info'); - await driver.scroll(verticalPageView, 0, -600, Duration(milliseconds: 400)); - await Future.delayed(Duration(seconds: 2)); + await driver.scroll(verticalPageView, 0, -600, const Duration(milliseconds: 400)); + await Future.delayed(const Duration(seconds: 2)); print('* scroll down to metadata details'); - await driver.scroll(verticalPageView, 0, -800, Duration(milliseconds: 600)); - await Future.delayed(Duration(seconds: 1)); + await driver.scroll(verticalPageView, 0, -800, const Duration(milliseconds: 600)); + await Future.delayed(const Duration(seconds: 1)); print('* toggle GPS metadata'); final gpsTile = find.descendant( @@ -225,8 +225,8 @@ void showInfoMetadata() { await driver.waitUntilNoTransientCallbacks(); print('* scroll up to show app bar'); - await driver.scroll(verticalPageView, 0, 100, Duration(milliseconds: 400)); - await Future.delayed(Duration(seconds: 1)); + await driver.scroll(verticalPageView, 0, 100, const Duration(milliseconds: 400)); + await Future.delayed(const Duration(seconds: 1)); print('* back to image'); await driver.tap(find.byValueKey('back-button')); @@ -236,7 +236,7 @@ void showInfoMetadata() { void scrollOffImage() { test('[viewer] scroll off', () async { - await driver.scroll(find.byValueKey('imageview'), 0, 800, Duration(milliseconds: 600)); - await Future.delayed(Duration(seconds: 1)); + await driver.scroll(find.byValueKey('imageview'), 0, 800, const Duration(milliseconds: 600)); + await Future.delayed(const Duration(seconds: 1)); }); }