diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 491819f81..1d2e33d68 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -20,6 +20,7 @@ import 'package:aves/widgets/common/app_bar_subtitle.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; import 'package:aves/widgets/common/basic/menu.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/sliver_app_bar_title.dart'; import 'package:aves/widgets/dialogs/tile_view_dialog.dart'; import 'package:aves/widgets/search/search_delegate.dart'; import 'package:flutter/material.dart'; @@ -116,7 +117,9 @@ class _CollectionAppBarState extends State with SingleTickerPr builder: (context, queryEnabled, child) { return SliverAppBar( leading: appMode.hasDrawer ? _buildAppBarLeading(isSelecting) : null, - title: _buildAppBarTitle(isSelecting), + title: SliverAppBarTitleWrapper( + child: _buildAppBarTitle(isSelecting), + ), actions: _buildActions( isSelecting: isSelecting, selectedItemCount: selectedItemCount, @@ -177,7 +180,7 @@ class _CollectionAppBarState extends State with SingleTickerPr ); } - Widget? _buildAppBarTitle(bool isSelecting) { + Widget _buildAppBarTitle(bool isSelecting) { final l10n = context.l10n; if (isSelecting) { diff --git a/lib/widgets/common/sliver_app_bar_title.dart b/lib/widgets/common/sliver_app_bar_title.dart new file mode 100644 index 000000000..0ed370ba2 --- /dev/null +++ b/lib/widgets/common/sliver_app_bar_title.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; + +// as of Flutter v2.8.1, fading opacity in `SliverAppBar` +// is not applied to title when `appBarTheme.titleTextStyle` is defined, +// so this wrapper manually applies opacity to the default text style +class SliverAppBarTitleWrapper extends StatelessWidget { + final Widget child; + + const SliverAppBarTitleWrapper({ + Key? key, + required this.child, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final toolbarOpacity = context.dependOnInheritedWidgetOfExactType()!.toolbarOpacity; + final baseColor = (DefaultTextStyle.of(context).style.color ?? Theme.of(context).primaryTextTheme.headline6!.color!); + return DefaultTextStyle.merge( + style: TextStyle(color: baseColor.withOpacity(toolbarOpacity)), + child: child, + ); + } +} diff --git a/lib/widgets/filter_grids/album_pick.dart b/lib/widgets/filter_grids/album_pick.dart index dfff41e2c..63755740b 100644 --- a/lib/widgets/filter_grids/album_pick.dart +++ b/lib/widgets/filter_grids/album_pick.dart @@ -16,6 +16,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/identity/empty.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; +import 'package:aves/widgets/common/sliver_app_bar_title.dart'; import 'package:aves/widgets/dialogs/filter_editors/create_album_dialog.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/album_set.dart'; @@ -141,9 +142,11 @@ class _AlbumPickAppBar extends StatelessWidget { return SliverAppBar( leading: const BackButton(), - title: SourceStateAwareAppBarTitle( - title: Text(title()), - source: source, + title: SliverAppBarTitleWrapper( + child: SourceStateAwareAppBarTitle( + title: Text(title()), + source: source, + ), ), bottom: _AlbumQueryBar( queryNotifier: queryNotifier, diff --git a/lib/widgets/filter_grids/common/app_bar.dart b/lib/widgets/filter_grids/common/app_bar.dart index ec443c7df..d5e3c4659 100644 --- a/lib/widgets/filter_grids/common/app_bar.dart +++ b/lib/widgets/filter_grids/common/app_bar.dart @@ -8,6 +8,7 @@ import 'package:aves/widgets/common/app_bar_subtitle.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; import 'package:aves/widgets/common/basic/menu.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/sliver_app_bar_title.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/search/search_delegate.dart'; import 'package:flutter/material.dart'; @@ -74,7 +75,9 @@ class _FilterGridAppBarState extends State extends State>, int>( selector: (context, selection) => selection.selectedItems.length, diff --git a/lib/widgets/viewer/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart index 611a1b7f5..0b4185886 100644 --- a/lib/widgets/viewer/info/info_app_bar.dart +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -5,6 +5,7 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; import 'package:aves/widgets/common/basic/menu.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:aves/widgets/common/sliver_app_bar_title.dart'; import 'package:aves/widgets/viewer/action/entry_info_action_delegate.dart'; import 'package:aves/widgets/viewer/info/info_search.dart'; import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; @@ -37,9 +38,11 @@ class InfoAppBar extends StatelessWidget { onPressed: onBackPressed, tooltip: context.l10n.viewerInfoBackToViewerTooltip, ), - title: InteractiveAppBarTitle( - onTap: () => _goToSearch(context), - child: Text(context.l10n.viewerInfoPageTitle), + title: SliverAppBarTitleWrapper( + child: InteractiveAppBarTitle( + onTap: () => _goToSearch(context), + child: Text(context.l10n.viewerInfoPageTitle), + ), ), actions: [ IconButton(