flutter在包含ListVIew的滚动列表页面中监听手势
列表控件内部页有监听事件,使用GestureDetector监听有冲突,所以使用NotificationListener。
示例中增加了Listener监听手指滑动方向
//手指的偏移量double _startDx = 0.0;double _endDx = 0.0;double _dy = 0.0;//标签栏高度double _tabBarHeight = 80.w;//标签栏刷新事件late StateSetter _setTabBarState;//偏移阈值double _listerOffsetThreshold = 40.0;_body() {return NotificationListener<ScrollNotification>(onNotification: (dynamic scrollNotification) {if (scrollNotification is ScrollUpdateNotification &&scrollNotification.depth == 0) {// 滚动且是列表滚动的时候// print('滑动偏移量:${scrollNotification.metrics.pixels}');}return true;},child: Listener(onPointerDown: (downPointer){_startDx = downPointer.position.dx;_dy = downPointer.position.dy;},onPointerMove: _onPointerMove,onPointerUp: _onPointerUp,child: Column(children: [// 头部分类列表_userShareTabBar(),// 推享文章列表Expand(child: ListView.builder(/// 列表)),],)));}_onPointerMove(PointerMoveEvent movePointer){//向下滑动。if (movePointer.position.dy - _dy > 0) {if (movePointer.position.dy - _dy > _listerOffsetThreshold) {print('向下滑动');_setTabBarState((){_tabBarHeight = 80.w;});}} else {if (-(movePointer.position.dy - _dy) > _listerOffsetThreshold) {print('向上滑动');_setTabBarState((){_tabBarHeight = 0.0;});}}}_onPointerUp(PointerUpEvent upPointer){_endDx = upPointer.position.dx;//向下滑动if (upPointer.position.dy - _dy > 0) {if (upPointer.position.dy - _dy > _listerOffsetThreshold) {print('向下滑动');_setTabBarState((){_tabBarHeight = 80.w;});}} else {if (-(upPointer.position.dy - _dy) > _listerOffsetThreshold) {print('向上滑动');_setTabBarState((){_tabBarHeight = 0.0;});}}final double _deltaX = _endDx - _startDx;if(_deltaX.abs() > _listerOffsetThreshold){if(_tabBarHeight == 0.0){_setTabBarState((){_tabBarHeight = 80.w;});}}}//在当前页面中需要局部刷新的模块
_userShareTabBar() {//使用StatefulBuilder在手势监听事件中调用局部的刷新(使用setState会刷新整个页面造成卡顿)return StatefulBuilder(builder: (context, setStateBuilder) {_setTabBarState = setStateBuilder;return AnimatedContainer(duration: Duration(milliseconds: 200),height: _tabBarHeight,child: UserShareTabBarPage());});}