diff --git a/lib/pages/dynamics/view.dart b/lib/pages/dynamics/view.dart index 0577fa29..2e01537b 100644 --- a/lib/pages/dynamics/view.dart +++ b/lib/pages/dynamics/view.dart @@ -1,12 +1,16 @@ +import 'dart:async'; + import 'package:custom_sliding_segmented_control/custom_sliding_segmented_control.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; import 'package:pilipala/common/skeleton/dynamic_card.dart'; import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/network_img_layer.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/utils/feed_back.dart'; import 'package:pilipala/utils/storage.dart'; @@ -36,18 +40,27 @@ class _DynamicsPageState extends State void initState() { super.initState(); _futureBuilderFuture = _dynamicsController.queryFollowDynamic(); - - _dynamicsController.scrollController.addListener( + ScrollController scrollController = _dynamicsController.scrollController; + StreamController mainStream = + Get.find().bottomBarStream; + scrollController.addListener( () async { - if (_dynamicsController.scrollController.position.pixels >= - _dynamicsController.scrollController.position.maxScrollExtent - - 200) { + if (scrollController.position.pixels >= + scrollController.position.maxScrollExtent - 200) { if (!_isLoadingMore) { _isLoadingMore = true; await _dynamicsController.queryFollowDynamic(type: 'onLoad'); _isLoadingMore = false; } } + + final ScrollDirection direction = + scrollController.position.userScrollDirection; + if (direction == ScrollDirection.forward) { + mainStream.add(true); + } else if (direction == ScrollDirection.reverse) { + mainStream.add(false); + } }, ); } diff --git a/lib/pages/hot/view.dart b/lib/pages/hot/view.dart index 826f4e6e..aa990326 100644 --- a/lib/pages/hot/view.dart +++ b/lib/pages/hot/view.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/widgets/animated_dialog.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/video_card_h.dart'; import 'package:pilipala/pages/hot/controller.dart'; +import 'package:pilipala/pages/main/index.dart'; class HotPage extends StatefulWidget { const HotPage({Key? key}) : super(key: key); @@ -26,15 +30,26 @@ class _HotPageState extends State with AutomaticKeepAliveClientMixin { void initState() { super.initState(); _futureBuilderFuture = _hotController.queryHotFeed('init'); - _hotController.scrollController.addListener( + ScrollController scrollController = _hotController.scrollController; + StreamController mainStream = + Get.find().bottomBarStream; + scrollController.addListener( () { - if (_hotController.scrollController.position.pixels >= - _hotController.scrollController.position.maxScrollExtent - 200) { + if (scrollController.position.pixels >= + scrollController.position.maxScrollExtent - 200) { if (!_hotController.isLoadingMore) { _hotController.isLoadingMore = true; _hotController.onLoad(); } } + + final ScrollDirection direction = + scrollController.position.userScrollDirection; + if (direction == ScrollDirection.forward) { + mainStream.add(true); + } else if (direction == ScrollDirection.reverse) { + mainStream.add(false); + } }, ); } diff --git a/lib/pages/live/view.dart b/lib/pages/live/view.dart index 8aba4073..3e26bafc 100644 --- a/lib/pages/live/view.dart +++ b/lib/pages/live/view.dart @@ -1,10 +1,14 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/skeleton/video_card_v.dart'; import 'package:pilipala/common/widgets/animated_dialog.dart'; import 'package:pilipala/common/widgets/http_error.dart'; import 'package:pilipala/common/widgets/overlay_pop.dart'; +import 'package:pilipala/pages/main/index.dart'; import 'controller.dart'; import 'widgets/live_item.dart'; @@ -22,15 +26,26 @@ class _LivePageState extends State { @override void initState() { super.initState(); - _liveController.scrollController.addListener( + ScrollController scrollController = _liveController.scrollController; + StreamController mainStream = + Get.find().bottomBarStream; + scrollController.addListener( () { - if (_liveController.scrollController.position.pixels >= - _liveController.scrollController.position.maxScrollExtent - 200) { + if (scrollController.position.pixels >= + scrollController.position.maxScrollExtent - 200) { if (!_liveController.isLoadingMore) { _liveController.isLoadingMore = true; _liveController.onLoad(); } } + + final ScrollDirection direction = + scrollController.position.userScrollDirection; + if (direction == ScrollDirection.forward) { + mainStream.add(true); + } else if (direction == ScrollDirection.reverse) { + mainStream.add(false); + } }, ); } diff --git a/lib/pages/main/controller.dart b/lib/pages/main/controller.dart index 0c81d155..2eea635b 100644 --- a/lib/pages/main/controller.dart +++ b/lib/pages/main/controller.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:get/get.dart'; import 'package:flutter/material.dart'; import 'package:pilipala/pages/dynamics/index.dart'; @@ -33,4 +35,5 @@ class MainController extends GetxController { 'label': "媒体库", } ].obs; + final StreamController bottomBarStream = StreamController(); } diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index 9018c629..bfdc3660 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:hive/hive.dart'; @@ -105,6 +107,7 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { localCache.put('sheetHeight', sheetHeight); localCache.put('statusBarHeight', statusBarHeight); return Scaffold( + extendBody: true, body: FadeTransition( opacity: _fadeAnimation!, child: SlideTransition( @@ -129,21 +132,33 @@ class _MainAppState extends State with SingleTickerProviderStateMixin { ), ), ), - bottomNavigationBar: BottomNavigationBar( - currentIndex: selectedIndex, - // type: BottomNavigationBarType.shifting, - selectedItemColor: Theme.of(context).colorScheme.primary, - unselectedItemColor: 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(), - ], + bottomNavigationBar: StreamBuilder( + stream: _mainController.bottomBarStream.stream, + initialData: true, + builder: (context, AsyncSnapshot snapshot) { + return AnimatedSlide( + curve: Curves.linear, + duration: const Duration(milliseconds: 300), + offset: Offset(0, snapshot.data ? 0 : 1), + child: BottomNavigationBar( + currentIndex: selectedIndex, + // type: BottomNavigationBarType.shifting, + selectedItemColor: Theme.of(context).colorScheme.primary, + unselectedItemColor: + 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(), + ], + ), + ); + }, ), ); } diff --git a/lib/pages/rcmd/view.dart b/lib/pages/rcmd/view.dart index 74814892..1b22a2db 100644 --- a/lib/pages/rcmd/view.dart +++ b/lib/pages/rcmd/view.dart @@ -1,4 +1,7 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; import 'package:get/get.dart'; import 'package:pilipala/common/constants.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/overlay_pop.dart'; import 'package:pilipala/common/widgets/video_card_v.dart'; +import 'package:pilipala/pages/main/index.dart'; import 'controller.dart'; @@ -26,15 +30,26 @@ class _RcmdPageState extends State @override void initState() { super.initState(); - _rcmdController.scrollController.addListener( + ScrollController scrollController = _rcmdController.scrollController; + StreamController mainStream = + Get.find().bottomBarStream; + scrollController.addListener( () { - if (_rcmdController.scrollController.position.pixels >= - _rcmdController.scrollController.position.maxScrollExtent - 200) { + if (scrollController.position.pixels >= + scrollController.position.maxScrollExtent - 200) { if (!_rcmdController.isLoadingMore) { _rcmdController.isLoadingMore = true; _rcmdController.onLoad(); } } + + final ScrollDirection direction = + scrollController.position.userScrollDirection; + if (direction == ScrollDirection.forward) { + mainStream.add(true); + } else if (direction == ScrollDirection.reverse) { + mainStream.add(false); + } }, ); }