[英]Dismiss keyboard on swipe back gesture in Flutter app
您需要创建一个扩展NavigatorObserver
的自定义类,并将其实例传递给MaterialApp
或CupertinoApp
的navigatorObservers
属性。
在该自定义类中,您可以覆盖didStartUserGesture
和didStopUserGesture
,它们将在滑动手势开始/结束时调用。 这应该允许您实现您正在寻找的行为。 请注意, didStartUserGesture
指示当前路由以及上一个路由,您可以根据此添加逻辑来确定是否应关闭键盘。
正如奥维迪乌所建议的
class DismissKeyboardNavigationObserver extends NavigatorObserver {
@override
void didStartUserGesture(Route route, Route previousRoute) {
SystemChannels.textInput.invokeMethod('TextInput.hide');
super.didStartUserGesture(route, previousRoute);
}
}
并在您的 Material App 中
MaterialApp(
navigatorObservers: [DismissKeyboardNavigationObserver()],
)
这应该是自然而然的,您不应该直接关心它,因为实际上,当您在键盘打开的情况下弹出路由时,它应该正确地关闭。
但是,如果您想检测用户何时开始滑动并关闭键盘,然后弹出当前路线,您可以通过使用GestureDetector
包裹您的屏幕小部件轻松实现它,如下所示:
Widget build(BuildContext context) {
double dragStart = 0.0;
return GestureDetector(
onHorizontalDragStart: (details) => dragStart = details.globalPosition.dx,
onHorizontalDragUpdate: (details) {
final double screenWidth = MediaQuery.of(context).size.width;
// Here I considered a back swipe only when the user swipes until half of the screen width, but you can tweak it to your needs.
if (dragStart <= screenWidth * 0.05 && details.globalPosition.dx >= screenWidth) {
FocusScope.of(context).unfocus();
}
child: // Your other widgets...
},
这是我写的东西来处理这个问题。 不使用任何外部包,您只需将内容包装在顶部的主要功能中。
Widget swipeOffKeyboard(BuildContext context, {Widget? child}) { return Listener( onPointerMove: (PointerMoveEvent pointer) { disKeyboard(pointer, context); }, child: child, // your content should go here ); } void disKeyboard(PointerMoveEvent pointer, BuildContext context) { double insets = MediaQuery.of(context).viewInsets.bottom; double screenHeight = MediaQuery.of(context).size.height; double position = pointer.position.dy; double keyboardHeight = screenHeight - insets; if (position > keyboardHeight && insets > 0) FocusManager.instance.primaryFocus?.unfocus(); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.