|
@@ -1,3 +1,4 @@
|
|
|
+import 'package:cpt_community/modules/my_following/my_following_vm.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:auto_route/auto_route.dart';
|
|
|
import 'package:flutter/rendering.dart';
|
|
@@ -38,6 +39,10 @@ class MyFollowerPage extends HookConsumerWidget {
|
|
|
final vm = ref.read(myFollowerVmProvider.notifier);
|
|
|
final state = ref.watch(myFollowerVmProvider);
|
|
|
|
|
|
+ final useSearchBar = useState(false);
|
|
|
+ // 用于存储前一次的滚动位置
|
|
|
+ final previousOffset = useState(0.0);
|
|
|
+
|
|
|
useEffect(() {
|
|
|
// 组件挂载时执行 - 执行接口请求
|
|
|
Future.microtask(() => vm.initPageData());
|
|
@@ -46,6 +51,11 @@ class MyFollowerPage extends HookConsumerWidget {
|
|
|
};
|
|
|
}, []);
|
|
|
|
|
|
+ useEffect((){
|
|
|
+ Log.d("---useSearchBar.value 变化为:---${useSearchBar.value}");
|
|
|
+ ref.read(myFollowingVmProvider.notifier)!.handlerChangeFollowerPageNavbar(useSearchBar.value);
|
|
|
+ }, [useSearchBar.value]);
|
|
|
+
|
|
|
|
|
|
return Scaffold(
|
|
|
// appBar: MyAppBar.appBar(
|
|
@@ -58,55 +68,87 @@ class MyFollowerPage extends HookConsumerWidget {
|
|
|
height: double.infinity,
|
|
|
width: double.infinity,
|
|
|
color: context.appColors.whiteBG,
|
|
|
- child: EasyRefresh(
|
|
|
- controller: vm.refreshController,
|
|
|
- // 上拉加载
|
|
|
- onLoad: () async{
|
|
|
- Log.d("----onLoad");
|
|
|
- vm.loadMore();
|
|
|
- },
|
|
|
- // 下拉刷新
|
|
|
- onRefresh: () async{
|
|
|
- Log.d("----onRefresh");
|
|
|
- vm.onRefresh();
|
|
|
+ child: NotificationListener<ScrollNotification>(
|
|
|
+ onNotification: (ScrollNotification notification) {
|
|
|
+ if (notification is ScrollUpdateNotification) {
|
|
|
+ final ScrollMetrics metrics = notification.metrics;
|
|
|
+ final double currentOffset = metrics.pixels;
|
|
|
+ final double prevOffset = previousOffset.value;
|
|
|
+ Log.d("---最大滚动距离-----${metrics.maxScrollExtent}-------");
|
|
|
+ if (currentOffset > prevOffset) {
|
|
|
+ // 向上滚动
|
|
|
+ // 日志输出当前滚动偏移量和前一次滚动偏移量
|
|
|
+ Log.d('--向上滚动---当前currentOffset: $currentOffset, previousOffset: $prevOffset---------');
|
|
|
+ if(useSearchBar.value == false && metrics.maxScrollExtent >=0 && currentOffset >= 110){
|
|
|
+ // 滚动到110 时 将 titlebar 换成 searchbar
|
|
|
+ useSearchBar.value = true;
|
|
|
+ }
|
|
|
+ } else if (currentOffset < prevOffset) {
|
|
|
+ // 向下滚动
|
|
|
+ // 日志输出当前滚动偏移量和前一次滚动偏移量
|
|
|
+ Log.d('--向下滚动---当前currentOffset: $currentOffset, previousOffset: $prevOffset---------');
|
|
|
+ if(useSearchBar.value == true && metrics.maxScrollExtent >=0 && currentOffset <= 110){
|
|
|
+ // 滚动到110 时 将 searchbar 换成 titlebar
|
|
|
+ useSearchBar.value = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 更新前一次的滚动位置
|
|
|
+ previousOffset.value = currentOffset;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返回 true 表示通知被消耗
|
|
|
+ return false;
|
|
|
},
|
|
|
- child: LoadStateLayout(
|
|
|
- state: state.loadingState,
|
|
|
- errorMessage: state.errorMessage,
|
|
|
- errorRetry: () {
|
|
|
- vm.retryRequest();
|
|
|
+ child: EasyRefresh(
|
|
|
+ controller: vm.refreshController,
|
|
|
+ // 上拉加载
|
|
|
+ onLoad: () async{
|
|
|
+ Log.d("----onLoad");
|
|
|
+ vm.loadMore();
|
|
|
+ },
|
|
|
+ // 下拉刷新
|
|
|
+ onRefresh: () async{
|
|
|
+ Log.d("----onRefresh");
|
|
|
+ vm.onRefresh();
|
|
|
},
|
|
|
- successSliverWidget:[
|
|
|
- SliverList(
|
|
|
- delegate: SliverChildBuilderDelegate(
|
|
|
- (context, index){
|
|
|
- return Padding(
|
|
|
- padding: const EdgeInsets.only(top: 10, bottom: 10, left: 10),
|
|
|
- child: SearchAppBar(
|
|
|
- hintText: 'Search',
|
|
|
- onChanged: (String value){
|
|
|
- vm.handlerSearchChange(value);
|
|
|
- },
|
|
|
- onSearch: (String value){
|
|
|
- vm.handlerSubmitSearch(value);
|
|
|
- },
|
|
|
- ),
|
|
|
- );
|
|
|
- },
|
|
|
- childCount: 1
|
|
|
- )
|
|
|
- ),
|
|
|
- SliverList(
|
|
|
- delegate: SliverChildBuilderDelegate(
|
|
|
- (context, index){
|
|
|
- return _buildFollowItem(context, ref, state.list![index], vm, index, state.list.length);
|
|
|
- },
|
|
|
- childCount: state.list!.length
|
|
|
- )
|
|
|
- )
|
|
|
- ],
|
|
|
- ),
|
|
|
- ).marginOnly(left: 15,right: 15,top: 15,bottom: 15),
|
|
|
+ child: LoadStateLayout(
|
|
|
+ state: state.loadingState,
|
|
|
+ errorMessage: state.errorMessage,
|
|
|
+ errorRetry: () {
|
|
|
+ vm.retryRequest();
|
|
|
+ },
|
|
|
+ successSliverWidget:[
|
|
|
+ SliverList(
|
|
|
+ delegate: SliverChildBuilderDelegate(
|
|
|
+ (context, index){
|
|
|
+ return Padding(
|
|
|
+ padding: const EdgeInsets.only(top: 10, bottom: 10, left: 10),
|
|
|
+ child: SearchAppBar(
|
|
|
+ hintText: 'Search',
|
|
|
+ onChanged: (String value){
|
|
|
+ vm.handlerSearchChange(value);
|
|
|
+ },
|
|
|
+ onSearch: (String value){
|
|
|
+ vm.handlerSubmitSearch(value);
|
|
|
+ },
|
|
|
+ ),
|
|
|
+ );
|
|
|
+ },
|
|
|
+ childCount: 1
|
|
|
+ )
|
|
|
+ ),
|
|
|
+ SliverList(
|
|
|
+ delegate: SliverChildBuilderDelegate(
|
|
|
+ (context, index){
|
|
|
+ return _buildFollowItem(context, ref, state.list![index], vm, index, state.list.length);
|
|
|
+ },
|
|
|
+ childCount: state.list!.length
|
|
|
+ )
|
|
|
+ )
|
|
|
+ ],
|
|
|
+ ),
|
|
|
+ ).marginOnly(left: 15,right: 15,top: 15,bottom: 15),
|
|
|
+ ),
|
|
|
)
|
|
|
);
|
|
|
}
|