Flutter任意方向滑动以重新加载当前屏幕



我希望用户能够通过向任何方向滑动来重新加载当前屏幕。现在,我已经尝试用我能找到的几乎所有手势检测小部件来实现这一点,但我认为它们有点不可靠。

例如,使用内置的手势检测器或使用它的酒吧软件包,滑动手势可能会注册7次(满分10次(。如果我有一个在滑动时注册的打印功能,在控制台中我会看到";查看端口动作方向";除了印刷品";"刷";10次中有7次。

所以我的问题是,我如何设置每次刷卡注册的位置?我想到的是不屑一顾或页面浏览小部件的滑动响应。有什么想法吗?提前感谢!


class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
void initState() {
super.initState();
}
void _onVerticalSwipe(SwipeDirection direction) {
setState(() {
if (direction == SwipeDirection.up) {
//print('Swiped up!');
Navigator.push(
context,
PageTransition(
type: PageTransitionType.downToUp, child: MyHomePage()));
} else {
// print('Swiped down!');
Navigator.push(
context,
PageTransition(
type: PageTransitionType.upToDown, child: MyHomePage()));
}
});
}
void _onHorizontalSwipe(SwipeDirection direction) {
setState(() {
if (direction == SwipeDirection.left) {
// print('Swiped left!');
Navigator.push(
context,
PageTransition(
type: PageTransitionType.rightToLeft, child: MyHomePage()));
} else {
// print('Swiped right!');
Navigator.push(
context,
PageTransition(
type: PageTransitionType.leftToRight, child: MyHomePage()));
}
});
}
Widget build(BuildContext context) {
return SimpleGestureDetector(
onVerticalSwipe: _onVerticalSwipe,
onHorizontalSwipe: _onHorizontalSwipe,
child: Scaffold(
body: Padding(
padding: const EdgeInsets.all(30.0),
child: Center(
child: Column(
children: <Widget>[
Expanded(child: FittedBox(child: Text('Text'))),
Expanded(child: FittedBox(child: Text('Image'))),
],
),
),
),
),
);
}
}

我通过调整我在网上找到的一些信息来回答我自己的问题。以下是一个反应灵敏、可靠的4向滑动动作!(注意:我使用页面转换包进行转换动画。(

var initial_x;
var distance_x;
var initial_y;
var distance_y;
GestureDetector(
onPanStart: (DragStartDetails details) {
initial_x = details.globalPosition.dx;
initial_y = details.globalPosition.dy;
},
onPanUpdate: (DragUpdateDetails details) {
distance_x = details.globalPosition.dx - initial_x;
distance_y = details.globalPosition.dy - initial_y;
},
onPanEnd: (DragEndDetails details) {

initial_x = 0.0;
initial_y = 0.0;
var x_abs = distance_x.abs();
var y_abs = distance_y.abs();
if (x_abs > y_abs) {
if (distance_x > 20) {
Navigator.pushReplacement(
context,
PageTransition(
type: PageTransitionType.leftToRight, child: MainSwiper()));
}
if (distance_x < -20) {
Navigator.pushReplacement(
context,
PageTransition(
type: PageTransitionType.rightToLeft, child: MainSwiper()));
}
} else if (y_abs > x_abs) {
if (distance_y > 20) {
Navigator.pushReplacement(
context,
PageTransition(
type: PageTransitionType.upToDown, child: MainSwiper()));
}
if (distance_y < -20) {
Navigator.pushReplacement(
context,
PageTransition(
type: PageTransitionType.downToUp, child: MainSwiper()));
}
}
},
child: Scaffold(

最新更新