feat: 首页顶栏&底栏固定 issues #243

This commit is contained in:
guozhigq
2023-12-02 22:41:24 +08:00
parent 7ed91a72c6
commit 6ebfe5872e
11 changed files with 70 additions and 11 deletions

View File

@ -6,6 +6,7 @@ import 'package:flutter/rendering.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/main/index.dart'; import 'package:pilipala/pages/main/index.dart';
import 'package:pilipala/pages/rcmd/view.dart'; import 'package:pilipala/pages/rcmd/view.dart';
@ -35,6 +36,8 @@ class _BangumiPageState extends State<BangumiPage>
scrollController = _bangumidController.scrollController; scrollController = _bangumidController.scrollController;
StreamController<bool> mainStream = StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream; Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().searchBarStream;
_futureBuilderFuture = _bangumidController.queryBangumiListFeed(); _futureBuilderFuture = _bangumidController.queryBangumiListFeed();
_futureBuilderFutureFollow = _bangumidController.queryBangumiFollow(); _futureBuilderFutureFollow = _bangumidController.queryBangumiFollow();
scrollController.addListener( scrollController.addListener(
@ -51,8 +54,10 @@ class _BangumiPageState extends State<BangumiPage>
scrollController.position.userScrollDirection; scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) { if (direction == ScrollDirection.forward) {
mainStream.add(true); mainStream.add(true);
searchBarStream.add(true);
} else if (direction == ScrollDirection.reverse) { } else if (direction == ScrollDirection.reverse) {
mainStream.add(false); mainStream.add(false);
searchBarStream.add(false);
} }
}, },
); );

View File

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
@ -15,6 +17,10 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
RxBool userLogin = false.obs; RxBool userLogin = false.obs;
RxString userFace = ''.obs; RxString userFace = ''.obs;
var userInfo; var userInfo;
Box setting = GStrorage.setting;
late final StreamController<bool> searchBarStream =
StreamController<bool>.broadcast();
late bool hideSearchBar;
@override @override
void onInit() { void onInit() {
@ -33,6 +39,8 @@ class HomeController extends GetxController with GetTickerProviderStateMixin {
length: tabs.length, length: tabs.length,
vsync: this, vsync: this,
); );
hideSearchBar =
setting.get(SettingBoxKey.hideSearchBar, defaultValue: true);
} }
void onRefresh() { void onRefresh() {

View File

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
@ -18,11 +20,17 @@ class _HomePageState extends State<HomePage>
with AutomaticKeepAliveClientMixin, TickerProviderStateMixin { with AutomaticKeepAliveClientMixin, TickerProviderStateMixin {
final HomeController _homeController = Get.put(HomeController()); final HomeController _homeController = Get.put(HomeController());
List videoList = []; List videoList = [];
Stream<bool> stream = Get.find<MainController>().bottomBarStream.stream; late Stream<bool> stream;
@override @override
bool get wantKeepAlive => true; bool get wantKeepAlive => true;
@override
void initState() {
super.initState();
stream = _homeController.searchBarStream.stream;
}
showUserBottonSheet() { showUserBottonSheet() {
feedBack(); feedBack();
showModalBottomSheet( showModalBottomSheet(
@ -46,7 +54,9 @@ class _HomePageState extends State<HomePage>
body: Column( body: Column(
children: [ children: [
CustomAppBar( CustomAppBar(
stream: stream, stream: _homeController.hideSearchBar
? stream
: StreamController<bool>.broadcast().stream,
ctr: _homeController, ctr: _homeController,
callback: showUserBottonSheet, callback: showUserBottonSheet,
), ),
@ -118,7 +128,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
duration: const Duration(milliseconds: 500), duration: const Duration(milliseconds: 500),
height: snapshot.data height: snapshot.data
? MediaQuery.of(context).padding.top + 52 ? MediaQuery.of(context).padding.top + 52
: MediaQuery.of(context).padding.top, : MediaQuery.of(context).padding.top - 10,
child: Container( child: Container(
padding: EdgeInsets.only( padding: EdgeInsets.only(
left: 20, left: 20,

View File

@ -9,6 +9,7 @@ import 'package:pilipala/common/widgets/overlay_pop.dart';
import 'package:pilipala/common/skeleton/video_card_h.dart'; import 'package:pilipala/common/skeleton/video_card_h.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/video_card_h.dart'; import 'package:pilipala/common/widgets/video_card_h.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/hot/controller.dart'; import 'package:pilipala/pages/hot/controller.dart';
import 'package:pilipala/pages/main/index.dart'; import 'package:pilipala/pages/main/index.dart';
@ -35,6 +36,8 @@ class _HotPageState extends State<HotPage> with AutomaticKeepAliveClientMixin {
scrollController = _hotController.scrollController; scrollController = _hotController.scrollController;
StreamController<bool> mainStream = StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream; Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().searchBarStream;
scrollController.addListener( scrollController.addListener(
() { () {
if (scrollController.position.pixels >= if (scrollController.position.pixels >=
@ -49,8 +52,10 @@ class _HotPageState extends State<HotPage> with AutomaticKeepAliveClientMixin {
scrollController.position.userScrollDirection; scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) { if (direction == ScrollDirection.forward) {
mainStream.add(true); mainStream.add(true);
searchBarStream.add(true);
} else if (direction == ScrollDirection.reverse) { } else if (direction == ScrollDirection.reverse) {
mainStream.add(false); mainStream.add(false);
searchBarStream.add(false);
} }
}, },
); );

View File

@ -9,6 +9,7 @@ import 'package:pilipala/common/skeleton/video_card_v.dart';
import 'package:pilipala/common/widgets/animated_dialog.dart'; import 'package:pilipala/common/widgets/animated_dialog.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/overlay_pop.dart'; import 'package:pilipala/common/widgets/overlay_pop.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/main/index.dart'; import 'package:pilipala/pages/main/index.dart';
import 'package:pilipala/pages/rcmd/index.dart'; import 'package:pilipala/pages/rcmd/index.dart';
@ -38,6 +39,8 @@ class _LivePageState extends State<LivePage>
scrollController = _liveController.scrollController; scrollController = _liveController.scrollController;
StreamController<bool> mainStream = StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream; Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().searchBarStream;
scrollController.addListener( scrollController.addListener(
() { () {
if (scrollController.position.pixels >= if (scrollController.position.pixels >=
@ -52,8 +55,10 @@ class _LivePageState extends State<LivePage>
scrollController.position.userScrollDirection; scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) { if (direction == ScrollDirection.forward) {
mainStream.add(true); mainStream.add(true);
searchBarStream.add(true);
} else if (direction == ScrollDirection.reverse) { } else if (direction == ScrollDirection.reverse) {
mainStream.add(false); mainStream.add(false);
searchBarStream.add(false);
} }
}, },
); );

View File

@ -55,6 +55,7 @@ class MainController extends GetxController {
StreamController<bool>.broadcast(); StreamController<bool>.broadcast();
Box setting = GStrorage.setting; Box setting = GStrorage.setting;
DateTime? _lastPressedAt; DateTime? _lastPressedAt;
late bool hideTabBar;
@override @override
void onInit() { void onInit() {
@ -62,6 +63,7 @@ class MainController extends GetxController {
if (setting.get(SettingBoxKey.autoUpdate, defaultValue: false)) { if (setting.get(SettingBoxKey.autoUpdate, defaultValue: false)) {
Utils.checkUpdata(); Utils.checkUpdata();
} }
hideTabBar = setting.get(SettingBoxKey.hideTabBar, defaultValue: true);
} }
Future<bool> onBackPressed(BuildContext context) { Future<bool> onBackPressed(BuildContext context) {

View File

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
@ -142,7 +144,9 @@ class _MainAppState extends State<MainApp> with SingleTickerProviderStateMixin {
), ),
), ),
bottomNavigationBar: StreamBuilder( bottomNavigationBar: StreamBuilder(
stream: _mainController.bottomBarStream.stream, stream: _mainController.hideTabBar
? _mainController.bottomBarStream.stream
: StreamController<bool>.broadcast().stream,
initialData: true, initialData: true,
builder: (context, AsyncSnapshot snapshot) { builder: (context, AsyncSnapshot snapshot) {
return AnimatedSlide( return AnimatedSlide(

View File

@ -11,6 +11,7 @@ import 'package:pilipala/common/widgets/animated_dialog.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/overlay_pop.dart'; import 'package:pilipala/common/widgets/overlay_pop.dart';
import 'package:pilipala/common/widgets/video_card_v.dart'; import 'package:pilipala/common/widgets/video_card_v.dart';
import 'package:pilipala/pages/home/index.dart';
import 'package:pilipala/pages/main/index.dart'; import 'package:pilipala/pages/main/index.dart';
import 'controller.dart'; import 'controller.dart';
@ -37,6 +38,8 @@ class _RcmdPageState extends State<RcmdPage>
ScrollController scrollController = _rcmdController.scrollController; ScrollController scrollController = _rcmdController.scrollController;
StreamController<bool> mainStream = StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream; Get.find<MainController>().bottomBarStream;
StreamController<bool> searchBarStream =
Get.find<HomeController>().searchBarStream;
scrollController.addListener( scrollController.addListener(
() { () {
if (scrollController.position.pixels >= if (scrollController.position.pixels >=
@ -52,8 +55,10 @@ class _RcmdPageState extends State<RcmdPage>
scrollController.position.userScrollDirection; scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) { if (direction == ScrollDirection.forward) {
mainStream.add(true); mainStream.add(true);
searchBarStream.add(true);
} else if (direction == ScrollDirection.reverse) { } else if (direction == ScrollDirection.reverse) {
mainStream.add(false); mainStream.add(false);
searchBarStream.add(false);
} }
}, },
); );

View File

@ -83,13 +83,20 @@ class _StyleSettingState extends State<StyleSetting> {
setKey: SettingBoxKey.enableMYBar, setKey: SettingBoxKey.enableMYBar,
defaultVal: true, defaultVal: true,
), ),
// SetSwitchItem( const SetSwitchItem(
// title: '首页单列', title: '首页顶栏收起',
// subTitle: '每行展示一个内容卡片', subTitle: '首页列表滑动时,收起顶栏',
// setKey: SettingBoxKey.enableSingleRow, setKey: SettingBoxKey.hideSearchBar,
// defaultVal: false, defaultVal: true,
// callFn: (val) => {SmartDialog.showToast('下次启动时生效')}, needReboot: true,
// ), ),
const SetSwitchItem(
title: '首页底栏收起',
subTitle: '首页列表滑动时,收起底栏',
setKey: SettingBoxKey.hideTabBar,
defaultVal: true,
needReboot: true,
),
ListTile( ListTile(
dense: false, dense: false,
title: Text('自定义列数', style: titleStyle), title: Text('自定义列数', style: titleStyle),

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
import 'package:pilipala/utils/utils.dart'; import 'package:pilipala/utils/utils.dart';
@ -9,6 +10,7 @@ class SetSwitchItem extends StatefulWidget {
final String? setKey; final String? setKey;
final bool? defaultVal; final bool? defaultVal;
final Function? callFn; final Function? callFn;
final bool? needReboot;
const SetSwitchItem({ const SetSwitchItem({
this.title, this.title,
@ -16,6 +18,7 @@ class SetSwitchItem extends StatefulWidget {
this.setKey, this.setKey,
this.defaultVal, this.defaultVal,
this.callFn, this.callFn,
this.needReboot,
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
@ -43,6 +46,9 @@ class _SetSwitchItemState extends State<SetSwitchItem> {
if (widget.callFn != null) { if (widget.callFn != null) {
widget.callFn!.call(val); widget.callFn!.call(val);
} }
if (widget.needReboot != null && widget.needReboot!) {
SmartDialog.showToast('重启生效');
}
setState(() {}); setState(() {});
} }

View File

@ -138,6 +138,8 @@ class SettingBoxKey {
static const String displayMode = 'displayMode'; static const String displayMode = 'displayMode';
static const String customRows = 'customRows'; // 自定义列 static const String customRows = 'customRows'; // 自定义列
static const String enableMYBar = 'enableMYBar'; static const String enableMYBar = 'enableMYBar';
static const String hideSearchBar = 'hideSearchBar'; // 收起顶栏
static const String hideTabBar = 'hideTabBar'; // 收起底栏
} }
class LocalCacheKey { class LocalCacheKey {