From 690392e3e85e7c5a8c55d7e5da27391607fa22bc Mon Sep 17 00:00:00 2001 From: honjow Date: Sat, 12 Jun 2021 19:05:46 +0800 Subject: [PATCH] =?UTF-8?q?Feat:=20=E5=AF=BC=E8=88=AA=E6=A0=8F=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/gallery_fav_controller.dart | 8 +- .../controller/galleryitem_controller.dart | 17 +- lib/pages/item/gallery_item_flow_large.dart | 4 +- .../controller/search_page_controller.dart | 5 + lib/pages/tab/view/favorite_page.dart | 94 ++++----- lib/pages/tab/view/gallery_page.dart | 190 +++++++++-------- lib/pages/tab/view/history_page.dart | 37 ++-- lib/pages/tab/view/popular_page.dart | 28 +-- lib/pages/tab/view/search_page_new.dart | 196 +++++++++++------- lib/pages/tab/view/watched_page.dart | 26 +-- .../cust_lib/persistent_header_builder.dart | 8 +- pubspec.lock | 7 + pubspec.yaml | 3 +- 13 files changed, 344 insertions(+), 279 deletions(-) diff --git a/lib/pages/gallery/controller/gallery_fav_controller.dart b/lib/pages/gallery/controller/gallery_fav_controller.dart index 8b341e5f5..f71208c49 100644 --- a/lib/pages/gallery/controller/gallery_fav_controller.dart +++ b/lib/pages/gallery/controller/gallery_fav_controller.dart @@ -111,7 +111,7 @@ class GalleryFavController extends GetxController { /// 点击收藏按钮处理 Future tapFav() async { - logger.v('tapFav'); + // logger.v('tapFav'); /// 网络收藏或者本地收藏 if (favcat.isNotEmpty || _pageController.localFav) { @@ -148,15 +148,12 @@ class GalleryFavController extends GetxController { ) : []; - // favList.add({'favId': 'l', 'favTitle': S.of(context).local_favorite}); favList.add(Favcat(favId: 'l', favTitle: S.of(context).local_favorite)); // diaolog 获取选择结果 final Map? result = await _favController.showFav(context, favList); - // logger.v('$result ${result.runtimeType}'); - if (result != null && result is Map) { logger.v('add fav $result'); @@ -200,9 +197,8 @@ class GalleryFavController extends GetxController { isLoading = true; try { - logger.v('[${_pageController.galleryItem.favcat}]'); if (favcat.isNotEmpty && favcat != 'l') { - logger.v('取消网络收藏'); + logger.v('删除网络收藏'); await GalleryFavParser.galleryAddfavorite( _pageController.galleryItem.gid!, _pageController.galleryItem.token!, diff --git a/lib/pages/item/controller/galleryitem_controller.dart b/lib/pages/item/controller/galleryitem_controller.dart index 29ba528db..4f74e827a 100644 --- a/lib/pages/item/controller/galleryitem_controller.dart +++ b/lib/pages/item/controller/galleryitem_controller.dart @@ -48,17 +48,14 @@ class GalleryItemController extends GetxController { set isFav(bool val) => _isFav.value = val; void setFavTitle({String favTitle = '', String? favcat}) { - // galleryItem.favTitle = favTitle; - galleryItem.copyWith(favTitle: favTitle); + // logger.d('setFavTitle '); + galleryItem = galleryItem.copyWith(favTitle: favTitle); isFav = favTitle.isNotEmpty; - if (favcat != null) { - // galleryItem.favcat = favcat; - galleryItem.copyWith(favcat: favcat); - // logger.d('item show fav'); + if (favcat != null || (favcat?.isNotEmpty ?? false)) { + galleryItem = galleryItem.copyWith(favcat: favcat); + logger.d('item set favcat $favcat'); } else { - // galleryItem.favcat = ''; - // galleryItem.favTitle = ''; - galleryItem.copyWith(favcat: '', favTitle: ''); + galleryItem = galleryItem.copyWith(favcat: '', favTitle: ''); } } @@ -96,7 +93,7 @@ class GalleryItemController extends GetxController { void firstPutPreview(List galleryPreview) { if (galleryPreview.isNotEmpty) { // galleryItem.galleryPreview = galleryPreview; - galleryItem.copyWith(galleryPreview: galleryPreview); + galleryItem = galleryItem.copyWith(galleryPreview: galleryPreview); } firstPagePreview = diff --git a/lib/pages/item/gallery_item_flow_large.dart b/lib/pages/item/gallery_item_flow_large.dart index b440125c9..e447fcfee 100644 --- a/lib/pages/item/gallery_item_flow_large.dart +++ b/lib/pages/item/gallery_item_flow_large.dart @@ -114,8 +114,8 @@ class GalleryItemFlowLarge extends StatelessWidget { //阴影 BoxShadow( color: CupertinoDynamicColor.resolve( - CupertinoColors.systemGrey5, context), - blurRadius: 5, + CupertinoColors.systemGrey4, context), + blurRadius: 10, ) ]), child: Column( diff --git a/lib/pages/tab/controller/search_page_controller.dart b/lib/pages/tab/controller/search_page_controller.dart index e7c262948..1146e3d22 100644 --- a/lib/pages/tab/controller/search_page_controller.dart +++ b/lib/pages/tab/controller/search_page_controller.dart @@ -152,6 +152,11 @@ class SearchPageController extends TabViewController { /// 点击键盘完成 Future onEditingComplete({bool clear = true}) async { + isBackgroundRefresh = false; + if (!cancelToken.isCancelled) { + cancelToken.cancel(); + } + change(state, status: RxStatus.success()); listType = ListType.gallery; await _startSearch(clear: clear); } diff --git a/lib/pages/tab/view/favorite_page.dart b/lib/pages/tab/view/favorite_page.dart index 9470ba3a2..42eeb7222 100644 --- a/lib/pages/tab/view/favorite_page.dart +++ b/lib/pages/tab/view/favorite_page.dart @@ -11,6 +11,8 @@ import 'package:fehviewer/pages/tab/view/gallery_base.dart'; import 'package:fehviewer/pages/tab/view/tab_base.dart'; import 'package:fehviewer/route/navigator_util.dart'; import 'package:fehviewer/route/routes.dart'; +import 'package:fehviewer/utils/cust_lib/persistent_header_builder.dart'; +import 'package:fehviewer/utils/cust_lib/sliver/sliver_persistent_header.dart'; import 'package:fehviewer/utils/logger.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -221,32 +223,30 @@ class FavoriteTab extends GetView { ); return CupertinoPageScaffold( - navigationBar: navigationBar, - child: SafeArea( - top: false, - bottom: false, - child: CupertinoScrollbar( + // navigationBar: navigationBar, + child: CupertinoScrollbar( + controller: scrollController, + child: CustomScrollView( controller: scrollController, - child: CustomScrollView( - controller: scrollController, - physics: const AlwaysScrollableScrollPhysics(), - slivers: [ - // sliverNavigationBar, - SliverPadding( - padding: EdgeInsets.only( - top: context.mediaQueryPadding.top + - kMinInteractiveDimensionCupertino), - sliver: CupertinoSliverRefreshControl( - onRefresh: controller.onRefresh, - ), - ), - SliverSafeArea( - top: false, - sliver: _getGalleryList(), + physics: const AlwaysScrollableScrollPhysics(), + slivers: [ + // sliverNavigationBar, + SliverFloatingPinnedPersistentHeader( + delegate: SliverFloatingPinnedPersistentHeaderBuilder( + minExtentProtoType: const SizedBox(), + maxExtentProtoType: navigationBar, + builder: (_, __, ___) => navigationBar, ), - _endIndicator(), - ], - ), + ), + CupertinoSliverRefreshControl( + onRefresh: controller.onRefresh, + ), + SliverSafeArea( + top: false, + sliver: _getGalleryList(), + ), + _endIndicator(), + ], ), ), ); @@ -264,32 +264,28 @@ class FavoriteTab extends GetView { ); return CupertinoPageScaffold( - navigationBar: navigationBar, - child: SafeArea( - top: false, - bottom: false, - child: CupertinoScrollbar( - controller: scrollController, - child: CustomScrollView(slivers: [ - // sliverNavigationBar, - SliverPadding( - padding: EdgeInsets.only( - top: Get.context?.mediaQueryPadding.top ?? - 0 + kMinInteractiveDimensionCupertino), - sliver: CupertinoSliverRefreshControl( - onRefresh: () async { - await controller.reloadData(); - }, - ), - ), - // todo 可能要设置刷新? - SliverSafeArea( - top: false, - sliver: _getGalleryList(), + // navigationBar: navigationBar, + child: CupertinoScrollbar( + controller: scrollController, + child: CustomScrollView(slivers: [ + // sliverNavigationBar, + SliverFloatingPinnedPersistentHeader( + delegate: SliverFloatingPinnedPersistentHeaderBuilder( + minExtentProtoType: const SizedBox(), + maxExtentProtoType: navigationBar, + builder: (_, __, ___) => navigationBar, ), - _endIndicator(), - ]), - ), + ), + CupertinoSliverRefreshControl( + onRefresh: controller.onRefresh, + ), + // todo 可能要设置刷新? + SliverSafeArea( + top: false, + sliver: _getGalleryList(), + ), + _endIndicator(), + ]), ), ); } diff --git a/lib/pages/tab/view/gallery_page.dart b/lib/pages/tab/view/gallery_page.dart index 4225db838..52a8f54ae 100644 --- a/lib/pages/tab/view/gallery_page.dart +++ b/lib/pages/tab/view/gallery_page.dart @@ -7,6 +7,8 @@ import 'package:fehviewer/pages/tab/controller/enum.dart'; import 'package:fehviewer/pages/tab/controller/gallery_controller.dart'; import 'package:fehviewer/pages/tab/view/gallery_base.dart'; import 'package:fehviewer/route/navigator_util.dart'; +import 'package:fehviewer/utils/cust_lib/persistent_header_builder.dart'; +import 'package:fehviewer/utils/cust_lib/sliver/sliver_persistent_header.dart'; import 'package:fehviewer/utils/logger.dart'; import 'package:fehviewer/utils/vibrate.dart'; import 'package:flutter/cupertino.dart'; @@ -25,86 +27,90 @@ class GalleryListTab extends GetView { @override Widget build(BuildContext context) { - final Widget sliverNavigationBar = CupertinoSliverNavigationBar( - transitionBetweenRoutes: false, - padding: const EdgeInsetsDirectional.only(end: 4), - largeTitle: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Text(controller.title), - Obx(() { - if (controller.isBackgroundRefresh) - return const CupertinoActivityIndicator( - radius: 10, - ).paddingSymmetric(horizontal: 8); - else - return const SizedBox(); - }), - ], - ), - leading: controller.enablePopupMenu && - (!Get.find().isSafeMode.value) - ? _buildLeading(context) - : const SizedBox(), - trailing: Row( - mainAxisSize: MainAxisSize.min, - mainAxisAlignment: MainAxisAlignment.end, - children: [ - // 搜索按钮 - CupertinoButton( - minSize: 40, - padding: const EdgeInsets.all(0), - child: const Icon( - LineIcons.search, - size: 26, + Widget getSliverNavigationBar() { + return CupertinoSliverNavigationBar( + transitionBetweenRoutes: false, + padding: const EdgeInsetsDirectional.only(end: 4), + largeTitle: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text(controller.title), + Obx(() { + if (controller.isBackgroundRefresh) + return const CupertinoActivityIndicator( + radius: 10, + ).paddingSymmetric(horizontal: 8); + else + return const SizedBox(); + }), + ], + ), + leading: controller.enablePopupMenu && + (!Get.find().isSafeMode.value) + ? _buildLeading(context) + : const SizedBox(), + trailing: Row( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + // 搜索按钮 + CupertinoButton( + minSize: 40, + padding: const EdgeInsets.all(0), + child: const Icon( + LineIcons.search, + size: 26, + ), + onPressed: () { + NavigatorUtil.showSearch(); + }, ), - onPressed: () { - NavigatorUtil.showSearch(); - }, - ), - // 筛选按钮 - CupertinoButton( - minSize: 40, - padding: const EdgeInsets.all(0), - child: const Icon( - LineIcons.filter, - size: 26, + // 筛选按钮 + CupertinoButton( + minSize: 40, + padding: const EdgeInsets.all(0), + child: const Icon( + LineIcons.filter, + size: 26, + ), + onPressed: () { + // logger.v('${EHUtils.convNumToCatMap(1)}'); + showFilterSetting(); + }, ), - onPressed: () { - // logger.v('${EHUtils.convNumToCatMap(1)}'); - showFilterSetting(); - }, - ), - // 页码跳转按钮 - CupertinoButton( - minSize: 40, - padding: const EdgeInsets.only(right: 6), - child: Container( - padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 0), - decoration: BoxDecoration( - border: Border.all( - color: CupertinoDynamicColor.resolve( - CupertinoColors.activeBlue, context), - width: 1.5, + // 页码跳转按钮 + CupertinoButton( + minSize: 40, + padding: const EdgeInsets.only(right: 6), + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 4, vertical: 0), + decoration: BoxDecoration( + border: Border.all( + color: CupertinoDynamicColor.resolve( + CupertinoColors.activeBlue, context), + width: 1.5, + ), + borderRadius: BorderRadius.circular(8), ), - borderRadius: BorderRadius.circular(8), + child: Obx(() => Text( + '${controller.curPage.value + 1}', + style: TextStyle( + color: CupertinoDynamicColor.resolve( + CupertinoColors.activeBlue, context)), + )), ), - child: Obx(() => Text( - '${controller.curPage.value + 1}', - style: TextStyle( - color: CupertinoDynamicColor.resolve( - CupertinoColors.activeBlue, context)), - )), + onPressed: () { + controller.jumpToPage(); + }, ), - onPressed: () { - controller.jumpToPage(); - }, - ), - ], - ), - ); + ], + ), + ); + } + + ; - final CupertinoNavigationBar navigationBar = CupertinoNavigationBar( + final ObstructingPreferredSizeWidget navigationBar = CupertinoNavigationBar( transitionBetweenRoutes: false, padding: const EdgeInsetsDirectional.only(end: 4), middle: Row( @@ -187,15 +193,25 @@ class GalleryListTab extends GetView { controller: scrollController, physics: const AlwaysScrollableScrollPhysics(), slivers: [ - // sliverNavigationBar, - SliverPadding( - padding: EdgeInsets.only( - top: context.mediaQueryPadding.top + - kMinInteractiveDimensionCupertino), - sliver: CupertinoSliverRefreshControl( - onRefresh: controller.onRefresh, + // getSliverNavigationBar(), + SliverFloatingPinnedPersistentHeader( + delegate: SliverFloatingPinnedPersistentHeaderBuilder( + minExtentProtoType: const SizedBox(), + maxExtentProtoType: navigationBar, + builder: (_, __, ___) => navigationBar, ), ), + CupertinoSliverRefreshControl( + onRefresh: controller.onRefresh, + ), + // SliverPadding( + // padding: EdgeInsets.only( + // top: context.mediaQueryPadding.top + + // kMinInteractiveDimensionCupertino), + // sliver: CupertinoSliverRefreshControl( + // onRefresh: controller.onRefresh, + // ), + // ), SliverSafeArea( top: false, bottom: false, @@ -206,14 +222,10 @@ class GalleryListTab extends GetView { ); return CupertinoPageScaffold( - navigationBar: navigationBar, - child: SafeArea( - top: false, - bottom: false, - child: CupertinoScrollbar( - child: customScrollView, - controller: scrollController, - ), + // navigationBar: navigationBar, + child: CupertinoScrollbar( + child: customScrollView, + controller: scrollController, ), ); } diff --git a/lib/pages/tab/view/history_page.dart b/lib/pages/tab/view/history_page.dart index e250e6a97..89317f749 100644 --- a/lib/pages/tab/view/history_page.dart +++ b/lib/pages/tab/view/history_page.dart @@ -2,6 +2,8 @@ import 'package:fehviewer/common/controller/history_controller.dart'; import 'package:fehviewer/generated/l10n.dart'; import 'package:fehviewer/pages/tab/controller/history_controller.dart'; import 'package:fehviewer/pages/tab/view/tab_base.dart'; +import 'package:fehviewer/utils/cust_lib/persistent_header_builder.dart'; +import 'package:fehviewer/utils/cust_lib/sliver/sliver_persistent_header.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; @@ -70,17 +72,24 @@ class HistoryTab extends GetView { controller: scrollController, physics: const AlwaysScrollableScrollPhysics(), slivers: [ - // sliverNavigationBar, - SliverPadding( - padding: EdgeInsets.only( - top: context.mediaQueryPadding.top + - kMinInteractiveDimensionCupertino), - sliver: CupertinoSliverRefreshControl( - onRefresh: () async { - await controller.reloadData(); - }, + SliverFloatingPinnedPersistentHeader( + delegate: SliverFloatingPinnedPersistentHeaderBuilder( + minExtentProtoType: const SizedBox(), + maxExtentProtoType: navigationBar, + builder: (_, __, ___) => navigationBar, ), ), + // sliverNavigationBar, + // SliverPadding( + // padding: EdgeInsets.only( + // top: context.mediaQueryPadding.top + + // kMinInteractiveDimensionCupertino), + // sliver: CupertinoSliverRefreshControl( + // onRefresh: () async { + // await controller.reloadData(); + // }, + // ), + // ), SliverSafeArea( top: false, // sliver: _getGalleryList(), @@ -96,12 +105,8 @@ class HistoryTab extends GetView { ); return CupertinoPageScaffold( - navigationBar: navigationBar, - child: SafeArea( - top: false, - bottom: false, - child: CupertinoScrollbar( - controller: scrollController, child: customScrollView), - )); + // navigationBar: navigationBar, + child: CupertinoScrollbar( + controller: scrollController, child: customScrollView)); } } diff --git a/lib/pages/tab/view/popular_page.dart b/lib/pages/tab/view/popular_page.dart index fa16a7110..404d8081a 100644 --- a/lib/pages/tab/view/popular_page.dart +++ b/lib/pages/tab/view/popular_page.dart @@ -3,6 +3,8 @@ import 'package:fehviewer/models/base/eh_models.dart'; import 'package:fehviewer/pages/tab/controller/popular_controller.dart'; import 'package:fehviewer/pages/tab/view/gallery_base.dart'; import 'package:fehviewer/pages/tab/view/tab_base.dart'; +import 'package:fehviewer/utils/cust_lib/persistent_header_builder.dart'; +import 'package:fehviewer/utils/cust_lib/sliver/sliver_persistent_header.dart'; import 'package:fehviewer/utils/logger.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -62,14 +64,16 @@ class PopularListTab extends GetView { physics: const AlwaysScrollableScrollPhysics(), slivers: [ // sliverNavigationBar, - SliverPadding( - padding: EdgeInsets.only( - top: context.mediaQueryPadding.top + - kMinInteractiveDimensionCupertino), - sliver: CupertinoSliverRefreshControl( - onRefresh: controller.onRefresh, + SliverFloatingPinnedPersistentHeader( + delegate: SliverFloatingPinnedPersistentHeaderBuilder( + minExtentProtoType: const SizedBox(), + maxExtentProtoType: navigationBar, + builder: (_, __, ___) => navigationBar, ), ), + CupertinoSliverRefreshControl( + onRefresh: controller.onRefresh, + ), SliverSafeArea( top: false, sliver: _getGalleryList(), @@ -78,14 +82,10 @@ class PopularListTab extends GetView { ); return CupertinoPageScaffold( - navigationBar: navigationBar, - child: SafeArea( - top: false, - bottom: false, - child: CupertinoScrollbar( - controller: scrollController, - child: customScrollView, - ), + // navigationBar: navigationBar, + child: CupertinoScrollbar( + controller: scrollController, + child: customScrollView, ), ); } diff --git a/lib/pages/tab/view/search_page_new.dart b/lib/pages/tab/view/search_page_new.dart index 41515d790..a5eb04527 100644 --- a/lib/pages/tab/view/search_page_new.dart +++ b/lib/pages/tab/view/search_page_new.dart @@ -1,5 +1,6 @@ import 'dart:math'; +import 'package:blur/blur.dart'; import 'package:extended_sliver/extended_sliver.dart'; import 'package:fehviewer/common/controller/tag_trans_controller.dart'; import 'package:fehviewer/common/service/depth_service.dart'; @@ -122,7 +123,7 @@ class GallerySearchPageNew extends StatelessWidget { return Obx(() => CupertinoTextField( style: const TextStyle(height: 1.25), decoration: BoxDecoration( - color: ehTheme.textFieldBackgroundColor, + color: ehTheme.textFieldBackgroundColor!.withOpacity(0.6), borderRadius: const BorderRadius.all(Radius.circular(8.0)), ), placeholder: controller.placeholderText, @@ -185,28 +186,14 @@ class GallerySearchPageNew extends StatelessWidget { @override Widget build(BuildContext context) { final Widget cfp = CupertinoPageScaffold( - navigationBar: getNavigationBar(context), - child: SafeArea( - bottom: false, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // _buildTrailing(context).paddingSymmetric(horizontal: 12), - // _buildSearchBar(context), - Expanded( - child: _buildSearchRult(context), - ), - ], - ), - ), + // navigationBar: getNavigationBar(context), + child: _buildSearchRult(context), ); return cfp; } Widget _buildSearchRult(BuildContext context) { - const _b = false; return GestureDetector( behavior: HitTestBehavior.opaque, onTap: () { @@ -219,29 +206,11 @@ class GallerySearchPageNew extends StatelessWidget { }, child: CustomScrollView( slivers: [ - if (_b) - SliverPersistentHeader( - pinned: true, - floating: true, - delegate: PersistentHeaderBuilder( - min: 0.5, - max: 100, - builder: _buildSearchBar, - ), - ), - if (_b) - SliverPinnedPersistentHeader( - delegate: SliverPinnedPersistentHeaderBuilder( - minExtentProtoType: const SizedBox(height: 1), - maxExtentProtoType: _buildSearchBar(context, 1.0), - builder: _buildSearchBar, - ), - ), SliverFloatingPinnedPersistentHeader( delegate: SliverFloatingPinnedPersistentHeaderBuilder( - minExtentProtoType: const SizedBox(height: 1), - maxExtentProtoType: _buildSearchBar(context, 1.0), - builder: _buildSearchBar, + minExtentProtoType: const SizedBox(), + maxExtentProtoType: _maxExtentProtoTypeBar(context), + builder: (_, __, maxExtent) => _buildSearchBar(_, __, maxExtent), ), ), Obx(() { @@ -252,6 +221,7 @@ class GallerySearchPageNew extends StatelessWidget { }), Obx(() => SliverSafeArea( bottom: false, + top: false, sliver: () { switch (controller.listType) { case ListType.gallery: @@ -267,26 +237,33 @@ class GallerySearchPageNew extends StatelessWidget { if (controller.listType != ListType.tag) { return _endIndicator(); } else { - return SliverToBoxAdapter( - child: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: controller.onEditingComplete, - child: Row( - mainAxisSize: MainAxisSize.min, - children: [ - const Icon( - LineIcons.search, - ).paddingOnly(right: 4), - Expanded( - child: Text( - '${S.of(context).search} ${controller.searchText}', - maxLines: 1, - softWrap: true, - overflow: TextOverflow.ellipsis, + return SliverSafeArea( + bottom: false, + top: false, + sliver: SliverToBoxAdapter( + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: controller.onEditingComplete, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + LineIcons.search, + size: 20, + color: CupertinoDynamicColor.resolve( + CupertinoColors.inactiveGray, context), + ).paddingOnly(right: 4), + Expanded( + child: Text( + '${S.of(context).search} ${controller.searchText}', + maxLines: 1, + softWrap: true, + overflow: TextOverflow.ellipsis, + ), ), - ), - ], - ).paddingSymmetric(vertical: 4, horizontal: 12), + ], + ).paddingSymmetric(vertical: 4, horizontal: 12), + ), ), ); } @@ -296,29 +273,96 @@ class GallerySearchPageNew extends StatelessWidget { ); } - Widget _buildSearchBar(BuildContext context, double offset, - {double maxExtent = 0}) { + Widget _buildSearchBar( + BuildContext context, double offset, double maxExtentCallBackValue) { // logger.v('offset $offset'); double iconOpacity = 0.0; - final transparentOffset = maxExtent - 30; + final transparentOffset = maxExtentCallBackValue - 60; if (offset < transparentOffset) { iconOpacity = 1 - offset / transparentOffset; } + final _barHeigth = + kMinInteractiveDimensionCupertino + context.mediaQueryPadding.top; return Container( - decoration: BoxDecoration( - color: CupertinoDynamicColor.resolve( - ehTheme.themeData!.barBackgroundColor, context) - .withOpacity(1), - border: _kDefaultNavBarBorder, - ), - padding: const EdgeInsets.symmetric(horizontal: 8), - child: Row( + height: maxExtentCallBackValue, + child: Column( + mainAxisSize: MainAxisSize.min, children: [ + // const SizedBox(), + Expanded( + flex: _barHeigth ~/ 1, + child: getNavigationBar(context), + ), Expanded( - child: Padding( - padding: const EdgeInsets.only(left: 4, top: 4, bottom: 4), - child: getSearchTextFieldIn( - multiline: true, iconOpacity: iconOpacity), + flex: (maxExtentCallBackValue - _barHeigth) ~/ 1, + child: Stack( + // fit: StackFit.expand, + alignment: Alignment.center, + children: [ + Frost( + blur: 5, + frostColor: CupertinoTheme.of(context) + .barBackgroundColor + .withOpacity(1), + frostOpacity: 0.75, + ), + Container( + decoration: const BoxDecoration( + // color: CupertinoDynamicColor.resolve( + // ehTheme.themeData!.barBackgroundColor, context) + // .withOpacity(1), + // color: Colors.red, + border: _kDefaultNavBarBorder, + ), + padding: EdgeInsets.only( + left: 8 + context.mediaQueryPadding.left, + right: 8 + context.mediaQueryPadding.right, + ), + child: Row( + children: [ + Expanded( + child: Padding( + padding: + const EdgeInsets.only(left: 4, top: 4, bottom: 4), + child: getSearchTextFieldIn( + multiline: true, iconOpacity: iconOpacity), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } + + Widget _maxExtentProtoTypeBar(BuildContext context) { + return Container( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const SizedBox(), + getNavigationBar(context), + Container( + decoration: BoxDecoration( + color: CupertinoDynamicColor.resolve( + ehTheme.themeData!.barBackgroundColor, context) + .withOpacity(1), + border: _kDefaultNavBarBorder, + ), + padding: const EdgeInsets.symmetric(horizontal: 8), + child: Row( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.only(left: 4, top: 4, bottom: 4), + child: getSearchTextFieldIn(multiline: true), + ), + ), + ], ), ), ], @@ -330,9 +374,11 @@ class GallerySearchPageNew extends StatelessWidget { return Row( mainAxisSize: MainAxisSize.min, children: [ - const Icon( - LineIcons.tag, - ).paddingOnly(right: 4), + Icon(LineIcons.tag, + size: 20, + color: CupertinoDynamicColor.resolve( + CupertinoColors.inactiveGray, Get.context!)) + .paddingOnly(right: 4), Expanded( child: Column( mainAxisSize: MainAxisSize.min, diff --git a/lib/pages/tab/view/watched_page.dart b/lib/pages/tab/view/watched_page.dart index 3eba52d98..d4d43e879 100644 --- a/lib/pages/tab/view/watched_page.dart +++ b/lib/pages/tab/view/watched_page.dart @@ -7,6 +7,8 @@ import 'package:fehviewer/pages/tab/controller/tabhome_controller.dart'; import 'package:fehviewer/pages/tab/controller/watched_controller.dart'; import 'package:fehviewer/pages/tab/view/gallery_base.dart'; import 'package:fehviewer/route/navigator_util.dart'; +import 'package:fehviewer/utils/cust_lib/persistent_header_builder.dart'; +import 'package:fehviewer/utils/cust_lib/sliver/sliver_persistent_header.dart'; import 'package:fehviewer/utils/logger.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -188,14 +190,16 @@ class WatchedListTab extends GetView { physics: const AlwaysScrollableScrollPhysics(), slivers: [ // sliverNavigationBar, - SliverPadding( - padding: EdgeInsets.only( - top: context.mediaQueryPadding.top + - kMinInteractiveDimensionCupertino), - sliver: CupertinoSliverRefreshControl( - onRefresh: controller.onRefresh, + SliverFloatingPinnedPersistentHeader( + delegate: SliverFloatingPinnedPersistentHeaderBuilder( + minExtentProtoType: const SizedBox(), + maxExtentProtoType: navigationBar, + builder: (_, __, ___) => navigationBar, ), ), + CupertinoSliverRefreshControl( + onRefresh: controller.onRefresh, + ), SliverSafeArea( top: false, bottom: false, @@ -206,13 +210,9 @@ class WatchedListTab extends GetView { ); return CupertinoPageScaffold( - navigationBar: navigationBar, - child: SafeArea( - top: false, - bottom: false, - child: CupertinoScrollbar( - controller: scrollController, child: customScrollView), - ), + // navigationBar: navigationBar, + child: CupertinoScrollbar( + controller: scrollController, child: customScrollView), ); } diff --git a/lib/utils/cust_lib/persistent_header_builder.dart b/lib/utils/cust_lib/persistent_header_builder.dart index 95d41a125..c02ca031d 100644 --- a/lib/utils/cust_lib/persistent_header_builder.dart +++ b/lib/utils/cust_lib/persistent_header_builder.dart @@ -41,13 +41,13 @@ class SliverPinnedPersistentHeaderBuilder minExtentProtoType: minExtentProtoType, maxExtentProtoType: maxExtentProtoType); - final Widget Function(BuildContext context, double offset, {double maxExtent}) + final Widget Function(BuildContext context, double offset, double? maxExtent) builder; @override Widget build(BuildContext context, double shrinkOffset, double? minExtent, double maxExtent, bool overlapsContent) { - return builder(context, shrinkOffset, maxExtent: maxExtent); + return builder(context, shrinkOffset, maxExtent); } @override @@ -67,13 +67,13 @@ class SliverFloatingPinnedPersistentHeaderBuilder minExtentProtoType: minExtentProtoType, maxExtentProtoType: maxExtentProtoType); - final Widget Function(BuildContext context, double offset, {double maxExtent}) + final Widget Function(BuildContext context, double offset, double maxExtent) builder; @override Widget build(BuildContext context, double shrinkOffset, double? minExtent, double maxExtent, bool overlapsContent) { - return builder(context, shrinkOffset, maxExtent: maxExtent); + return builder(context, shrinkOffset, maxExtent); } @override diff --git a/pubspec.lock b/pubspec.lock index ee416fe41..3674eda51 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -50,6 +50,13 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "3.1.0" + blur: + dependency: "direct main" + description: + name: blur + url: "https://pub.flutter-io.cn" + source: hosted + version: "2.0.0" boolean_selector: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 724bcc2f2..e4a49decc 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -3,7 +3,7 @@ description: fehviewer publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 1.1.16+201 +version: 1.1.16+203 environment: sdk: '>=2.12.0 <3.0.0' @@ -170,6 +170,7 @@ dependencies: hive: ^2.0.4 hive_flutter: ^1.0.0 extended_sliver: ^2.0.0 + blur: ^2.0.0 # google_ml_kit: ^0.6.0 # learning_language: #^0.0.3+2 # git: