fix: close menu anchor on navigation (#22021)

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong 2025-09-16 01:35:22 +05:30 committed by GitHub
parent 8d849d226d
commit 81eb5ab40d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -40,6 +40,7 @@ class AlbumSelector extends ConsumerStatefulWidget {
class _AlbumSelectorState extends ConsumerState<AlbumSelector> { class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
bool isGrid = false; bool isGrid = false;
final searchController = TextEditingController(); final searchController = TextEditingController();
final menuController = MenuController();
final searchFocusNode = FocusNode(); final searchFocusNode = FocusNode();
List<RemoteAlbum> sortedAlbums = []; List<RemoteAlbum> sortedAlbums = [];
List<RemoteAlbum> shownAlbums = []; List<RemoteAlbum> shownAlbums = [];
@ -157,34 +158,45 @@ class _AlbumSelectorState extends ConsumerState<AlbumSelector> {
await sortAlbums(); await sortAlbums();
}); });
return MultiSliver( return PopScope(
children: [ onPopInvokedWithResult: (didPop, _) {
_SearchBar( menuController.close();
searchController: searchController, },
searchFocusNode: searchFocusNode, child: MultiSliver(
onSearch: onSearch, children: [
filterMode: filter.mode, _SearchBar(
onClearSearch: clearSearch, searchController: searchController,
), searchFocusNode: searchFocusNode,
_QuickFilterButtonRow( onSearch: onSearch,
filterMode: filter.mode, filterMode: filter.mode,
onChangeFilter: changeFilter, onClearSearch: clearSearch,
onSearch: onSearch, ),
searchController: searchController, _QuickFilterButtonRow(
), filterMode: filter.mode,
_QuickSortAndViewMode(isGrid: isGrid, onToggleViewMode: toggleViewMode, onSortChanged: changeSort), onChangeFilter: changeFilter,
isGrid onSearch: onSearch,
? _AlbumGrid(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected) searchController: searchController,
: _AlbumList(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected), ),
], _QuickSortAndViewMode(
isGrid: isGrid,
onToggleViewMode: toggleViewMode,
onSortChanged: changeSort,
controller: menuController,
),
isGrid
? _AlbumGrid(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected)
: _AlbumList(albums: shownAlbums, userId: userId, onAlbumSelected: widget.onAlbumSelected),
],
),
); );
} }
} }
class _SortButton extends ConsumerStatefulWidget { class _SortButton extends ConsumerStatefulWidget {
const _SortButton(this.onSortChanged); const _SortButton(this.onSortChanged, {this.controller});
final Future<void> Function(AlbumSort) onSortChanged; final Future<void> Function(AlbumSort) onSortChanged;
final MenuController? controller;
@override @override
ConsumerState<_SortButton> createState() => _SortButtonState(); ConsumerState<_SortButton> createState() => _SortButtonState();
@ -220,6 +232,7 @@ class _SortButtonState extends ConsumerState<_SortButton> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MenuAnchor( return MenuAnchor(
controller: widget.controller,
style: MenuStyle( style: MenuStyle(
elevation: const WidgetStatePropertyAll(1), elevation: const WidgetStatePropertyAll(1),
shape: WidgetStateProperty.all( shape: WidgetStateProperty.all(
@ -449,10 +462,16 @@ class _QuickFilterButton extends StatelessWidget {
} }
class _QuickSortAndViewMode extends StatelessWidget { class _QuickSortAndViewMode extends StatelessWidget {
const _QuickSortAndViewMode({required this.isGrid, required this.onToggleViewMode, required this.onSortChanged}); const _QuickSortAndViewMode({
required this.isGrid,
required this.onToggleViewMode,
required this.onSortChanged,
this.controller,
});
final bool isGrid; final bool isGrid;
final VoidCallback onToggleViewMode; final VoidCallback onToggleViewMode;
final MenuController? controller;
final Future<void> Function(AlbumSort) onSortChanged; final Future<void> Function(AlbumSort) onSortChanged;
@override @override
@ -463,7 +482,7 @@ class _QuickSortAndViewMode extends StatelessWidget {
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
_SortButton(onSortChanged), _SortButton(onSortChanged, controller: controller),
IconButton( IconButton(
icon: Icon(isGrid ? Icons.view_list_outlined : Icons.grid_view_outlined, size: 24), icon: Icon(isGrid ? Icons.view_list_outlined : Icons.grid_view_outlined, size: 24),
onPressed: onToggleViewMode, onPressed: onToggleViewMode,