con un clic
filter-sortby-floating-bar
// Build pages with 搜索/筛选/排序 的“floating bar”(姐狗味)交互:筛选按钮 + fake input + sortBy,放在 floatingActionButton 且使用 FloatingActionButtonLocation.centerDocked。参考 SearchMediaResultPage 的结构与视觉实现。
// Build pages with 搜索/筛选/排序 的“floating bar”(姐狗味)交互:筛选按钮 + fake input + sortBy,放在 floatingActionButton 且使用 FloatingActionButtonLocation.centerDocked。参考 SearchMediaResultPage 的结构与视觉实现。
Implements settings-style form pages using SettingsFormManager, SettingsFieldConfig, and SettingsFormRowBuilder. Use when adding or refactoring a page backed by env key/value fields, system settings forms, directory-like single-object editors, or when the user asks to use the project’s shared form logic for a form UI.
Generates MoviePilot mobile plugin form adapters (vue mode). Use when adding a new plugin adapter, creating a controller for a plugin (e.g. P115StrmHelper, ProxmoxVEBackup), or when the user asks to generate or scaffold plugin adapter code.
Guides how to adapt `lib/modules/dynamic_form` so plugin dashboards or configuration forms render correctly. Use when a request involves `/plugin/dynamic-form`, `DynamicFormPage`, new block types, converter tweaks, or controller bindings for a plugin.
| name | filter-sortby-floating-bar |
| description | Build pages with 搜索/筛选/排序 的“floating bar”(姐狗味)交互:筛选按钮 + fake input + sortBy,放在 floatingActionButton 且使用 FloatingActionButtonLocation.centerDocked。参考 SearchMediaResultPage 的结构与视觉实现。 |
适用场景:列表型页面需要「关键字搜索/筛选(Filter)/排序(SortBy)」,且希望交互入口固定在底部中间(FloatingActionButtonLocation.centerDocked),呈现“悬浮玻璃胶囊条”的观感。
lib/modules/search/pages/search_media_result_page.dart
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked_buildFloatingBar:Filter / FakeInput / SortByScaffold
floatingActionButtonLocation: FloatingActionButtonLocation.centerDockedfloatingActionButton: _buildFloatingBar(context)body: _buildBody(...)body 底部预留空间,避免列表最后一项被 floating bar 覆盖(参考 SearchMediaResultPage 的 bottom spacer 处理)。最少需要三个状态:
keyword:当前搜索关键字(String)filters:筛选条件(结构自定义,建议可序列化,便于持久化/恢复)sortKey + sortDirection:排序 key 与升降序推荐约定(与 SearchMediaResultPage 一致):
visibleItems:基于 keyword/filters/sort 计算后的展示列表hasActiveFilters:是否存在激活筛选,用于高亮 filter 图标updateKeyword(String v):更新 keyword 并触发列表刷新openFilterSheet():打开筛选 sheet,返回新 filtersupdateSortKey(K key) / toggleSortDirection():更新排序布局:Row([filterButton, Expanded(fakeInput), sortButton])
视觉关键点(从 SearchMediaResultPage 抽取):
Colors.white.withValues(alpha: 0.2))border: Border.all(color: theme.colorScheme.outline.withValues(alpha: 0.1), width: 0.5)ClipRRect(borderRadius: 999) + BackdropFilter(ImageFilter.blur(sigmaX: 90, sigmaY: 90))CupertinoIcons.slider_horizontal_3(有激活筛选时变色)GestureDetector 打开 keyword 输入 sheetSortPullDownWidget)CupertinoSearchTextField)isScrollControlled: truebackgroundColor: Colors.transparentMediaQuery.viewInsets.bottom 做 padding建议使用 showCupertinoModalBottomSheet(项目已有 modal_bottom_sheet 依赖):
SearchMediaResultPage 使用 SearchResultFilterSheet + section config 组织筛选项建议复用 lib/modules/search_result/widgets/sort_pull_down_widget.dart:
labelBuilder 映射展示文案(参考 SearchMediaResultPage._sortLabel)visibleItemsScaffold 上设置:
floatingActionButtonLocation: FloatingActionButtonLocation.centerDockedfloatingActionButton: _buildFloatingBar(context)_buildFloatingFilterButton_buildFakeSearchBar(GestureDetector + text 展示 + icon)_buildFloatingSortButton(SortPullDownWidget)_openKeywordSheet(CupertinoSearchTextField)_openFilterSheet(modal sheet)