如何解决ListView不会通过单击他内部的容器来滚动
我在将自定义按钮(在本例中为ServiceBlock)放在BounceWidget(listview代码下面的代码)中的listview滚动时遇到问题。在添加BounceWidget之前,我的列表视图可以完美滚动,但是当我添加它时,我无法通过单击ServiceBlock来滚动列表视图,并且当我单击按钮之间的空白时它仍在滚动。
我的listView:
SingleChildScrollView(
scrollDirection: Axis.horizontal,child: Container(
height: 110,width: screenWidth,child: ListView(
scrollDirection: Axis.horizontal,children: [
BouncingWidget(
duration: Duration(milliseconds: 120),scaleFactor: 1.5,child: ServiceBlock(
),onPressed: () {
}),SizedBox(width: 10,)
BouncingWidget(
duration: Duration(milliseconds: 120),onPressed: () {
},child: ServiceBlock(
),),],
如果您对BounceWidget感到困惑,这是它的代码:
class BouncingWidget extends StatefulWidget {
final Widget child;
final VoidCallback onPressed;
final double scaleFactor;
final Duration duration;
const BouncingWidget({
Key key,@required this.child,@required this.onPressed,this.scaleFactor = 1,this.duration = const Duration(milliseconds: 200),}) : super(key: key);
@override
_BouncingWidgetState createState() => _BouncingWidgetState();
}
class _BouncingWidgetState extends State<BouncingWidget>
with SingleTickerProviderStateMixin {
AnimationController _controller;
double _scale;
GlobalKey _childKey = GlobalKey();
bool _isOutside = false;
Widget get child => widget.child;
VoidCallback get onPressed => widget.onPressed;
double get scaleFactor => widget.scaleFactor;
Duration get duration => widget.duration;
@override
void initState() {
_controller = AnimationController(
vsync: this,duration: duration,lowerBound: 0.0,upperBound: 0.1,)..addListener(() {
setState(() {});
});
super.initState();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
_scale = 1 - (_controller.value * scaleFactor);
return GestureDetector(
onTapDown: _onTapDown,onTapUp: _onTapUp,onLongPressEnd: (details) => _onLongPressEnd(details,context),onHorizontalDragEnd: _onDragEnd,onVerticalDragEnd: _onDragEnd,onHorizontalDragUpdate: (details) => _onDragUpdate(details,onVerticalDragUpdate: (details) => _onDragUpdate(details,child: Transform.scale(
key: _childKey,scale: _scale,child: child,);
}
_triggerOnPressed() {
if (onPressed != null) {
onPressed();
}
}
_onTapDown(TapDownDetails details) {
_controller.forward();
}
_onTapUp(TapUpDetails details) {
Future.delayed(duration,() {
_controller.reverse();
});
_triggerOnPressed();
}
_onDragUpdate(DragUpdateDetails details,BuildContext context) {
final Offset touchPosition = details.globalPosition;
_isOutside = _isOutsideChildBox(touchPosition);
}
_onLongPressEnd(LongPressEndDetails details,BuildContext context) {
final Offset touchPosition = details.globalPosition;
if (!_isOutsideChildBox(touchPosition)) {
_triggerOnPressed();
}
_controller.reverse();
}
_onDragEnd(DragEndDetails details) {
if (!_isOutside) {
_triggerOnPressed();
}
_controller.reverse();
}
bool _isOutsideChildBox(Offset touchPosition) {
final RenderBox childRenderBox =
_childKey.currentContext.findRenderObject();
final Size childSize = childRenderBox.size;
final Offset childPosition = childRenderBox.localToGlobal(Offset.zero);
return (touchPosition.dx < childPosition.dx ||
touchPosition.dx > childPosition.dx + childSize.width ||
touchPosition.dy < childPosition.dy ||
touchPosition.dy > childPosition.dy + childSize.height);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。