feat: 上滑隐藏bottomBar

This commit is contained in:
guozhigq
2023-08-06 16:40:23 +08:00
parent f5f1ffb2be
commit 930282b7bd
6 changed files with 105 additions and 29 deletions

View File

@ -1,12 +1,16 @@
import 'dart:async';
import 'package:custom_sliding_segmented_control/custom_sliding_segmented_control.dart'; import 'package:custom_sliding_segmented_control/custom_sliding_segmented_control.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:pilipala/common/skeleton/dynamic_card.dart'; import 'package:pilipala/common/skeleton/dynamic_card.dart';
import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/http_error.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/dynamics/result.dart'; import 'package:pilipala/models/dynamics/result.dart';
import 'package:pilipala/pages/main/index.dart';
import 'package:pilipala/pages/mine/index.dart'; import 'package:pilipala/pages/mine/index.dart';
import 'package:pilipala/utils/feed_back.dart'; import 'package:pilipala/utils/feed_back.dart';
import 'package:pilipala/utils/storage.dart'; import 'package:pilipala/utils/storage.dart';
@ -36,18 +40,27 @@ class _DynamicsPageState extends State<DynamicsPage>
void initState() { void initState() {
super.initState(); super.initState();
_futureBuilderFuture = _dynamicsController.queryFollowDynamic(); _futureBuilderFuture = _dynamicsController.queryFollowDynamic();
ScrollController scrollController = _dynamicsController.scrollController;
_dynamicsController.scrollController.addListener( StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
scrollController.addListener(
() async { () async {
if (_dynamicsController.scrollController.position.pixels >= if (scrollController.position.pixels >=
_dynamicsController.scrollController.position.maxScrollExtent - scrollController.position.maxScrollExtent - 200) {
200) {
if (!_isLoadingMore) { if (!_isLoadingMore) {
_isLoadingMore = true; _isLoadingMore = true;
await _dynamicsController.queryFollowDynamic(type: 'onLoad'); await _dynamicsController.queryFollowDynamic(type: 'onLoad');
_isLoadingMore = false; _isLoadingMore = false;
} }
} }
final ScrollDirection direction =
scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) {
mainStream.add(true);
} else if (direction == ScrollDirection.reverse) {
mainStream.add(false);
}
}, },
); );
} }

View File

@ -1,4 +1,7 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:pilipala/common/widgets/animated_dialog.dart'; import 'package:pilipala/common/widgets/animated_dialog.dart';
import 'package:pilipala/common/widgets/overlay_pop.dart'; import 'package:pilipala/common/widgets/overlay_pop.dart';
@ -6,6 +9,7 @@ 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/hot/controller.dart'; import 'package:pilipala/pages/hot/controller.dart';
import 'package:pilipala/pages/main/index.dart';
class HotPage extends StatefulWidget { class HotPage extends StatefulWidget {
const HotPage({Key? key}) : super(key: key); const HotPage({Key? key}) : super(key: key);
@ -26,15 +30,26 @@ class _HotPageState extends State<HotPage> with AutomaticKeepAliveClientMixin {
void initState() { void initState() {
super.initState(); super.initState();
_futureBuilderFuture = _hotController.queryHotFeed('init'); _futureBuilderFuture = _hotController.queryHotFeed('init');
_hotController.scrollController.addListener( ScrollController scrollController = _hotController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
scrollController.addListener(
() { () {
if (_hotController.scrollController.position.pixels >= if (scrollController.position.pixels >=
_hotController.scrollController.position.maxScrollExtent - 200) { scrollController.position.maxScrollExtent - 200) {
if (!_hotController.isLoadingMore) { if (!_hotController.isLoadingMore) {
_hotController.isLoadingMore = true; _hotController.isLoadingMore = true;
_hotController.onLoad(); _hotController.onLoad();
} }
} }
final ScrollDirection direction =
scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) {
mainStream.add(true);
} else if (direction == ScrollDirection.reverse) {
mainStream.add(false);
}
}, },
); );
} }

View File

@ -1,10 +1,14 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
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/skeleton/video_card_v.dart'; 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/main/index.dart';
import 'controller.dart'; import 'controller.dart';
import 'widgets/live_item.dart'; import 'widgets/live_item.dart';
@ -22,15 +26,26 @@ class _LivePageState extends State<LivePage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_liveController.scrollController.addListener( ScrollController scrollController = _liveController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
scrollController.addListener(
() { () {
if (_liveController.scrollController.position.pixels >= if (scrollController.position.pixels >=
_liveController.scrollController.position.maxScrollExtent - 200) { scrollController.position.maxScrollExtent - 200) {
if (!_liveController.isLoadingMore) { if (!_liveController.isLoadingMore) {
_liveController.isLoadingMore = true; _liveController.isLoadingMore = true;
_liveController.onLoad(); _liveController.onLoad();
} }
} }
final ScrollDirection direction =
scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) {
mainStream.add(true);
} else if (direction == ScrollDirection.reverse) {
mainStream.add(false);
}
}, },
); );
} }

View File

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:pilipala/pages/dynamics/index.dart'; import 'package:pilipala/pages/dynamics/index.dart';
@ -33,4 +35,5 @@ class MainController extends GetxController {
'label': "媒体库", 'label': "媒体库",
} }
].obs; ].obs;
final StreamController<bool> bottomBarStream = StreamController<bool>();
} }

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';
@ -105,6 +107,7 @@ class _MainAppState extends State<MainApp> with SingleTickerProviderStateMixin {
localCache.put('sheetHeight', sheetHeight); localCache.put('sheetHeight', sheetHeight);
localCache.put('statusBarHeight', statusBarHeight); localCache.put('statusBarHeight', statusBarHeight);
return Scaffold( return Scaffold(
extendBody: true,
body: FadeTransition( body: FadeTransition(
opacity: _fadeAnimation!, opacity: _fadeAnimation!,
child: SlideTransition( child: SlideTransition(
@ -129,21 +132,33 @@ class _MainAppState extends State<MainApp> with SingleTickerProviderStateMixin {
), ),
), ),
), ),
bottomNavigationBar: BottomNavigationBar( bottomNavigationBar: StreamBuilder(
currentIndex: selectedIndex, stream: _mainController.bottomBarStream.stream,
// type: BottomNavigationBarType.shifting, initialData: true,
selectedItemColor: Theme.of(context).colorScheme.primary, builder: (context, AsyncSnapshot snapshot) {
unselectedItemColor: Theme.of(context).colorScheme.onSurfaceVariant, return AnimatedSlide(
selectedFontSize: 12.4, curve: Curves.linear,
onTap: (value) => setIndex(value), duration: const Duration(milliseconds: 300),
items: [ offset: Offset(0, snapshot.data ? 0 : 1),
..._mainController.navigationBars.map((e) { child: BottomNavigationBar(
return BottomNavigationBarItem( currentIndex: selectedIndex,
icon: e['icon'], // type: BottomNavigationBarType.shifting,
label: e['label'], selectedItemColor: Theme.of(context).colorScheme.primary,
); unselectedItemColor:
}).toList(), Theme.of(context).colorScheme.onSurfaceVariant,
], selectedFontSize: 12.4,
onTap: (value) => setIndex(value),
items: [
..._mainController.navigationBars.map((e) {
return BottomNavigationBarItem(
icon: e['icon'],
label: e['label'],
);
}).toList(),
],
),
);
},
), ),
); );
} }

View File

@ -1,4 +1,7 @@
import 'dart:async';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
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/skeleton/video_card_v.dart'; import 'package:pilipala/common/skeleton/video_card_v.dart';
@ -6,6 +9,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/main/index.dart';
import 'controller.dart'; import 'controller.dart';
@ -26,15 +30,26 @@ class _RcmdPageState extends State<RcmdPage>
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_rcmdController.scrollController.addListener( ScrollController scrollController = _rcmdController.scrollController;
StreamController<bool> mainStream =
Get.find<MainController>().bottomBarStream;
scrollController.addListener(
() { () {
if (_rcmdController.scrollController.position.pixels >= if (scrollController.position.pixels >=
_rcmdController.scrollController.position.maxScrollExtent - 200) { scrollController.position.maxScrollExtent - 200) {
if (!_rcmdController.isLoadingMore) { if (!_rcmdController.isLoadingMore) {
_rcmdController.isLoadingMore = true; _rcmdController.isLoadingMore = true;
_rcmdController.onLoad(); _rcmdController.onLoad();
} }
} }
final ScrollDirection direction =
scrollController.position.userScrollDirection;
if (direction == ScrollDirection.forward) {
mainStream.add(true);
} else if (direction == ScrollDirection.reverse) {
mainStream.add(false);
}
}, },
); );
} }