当用户从边缘滑动以弹出路线时,我试图关闭键盘。
当前,直到路线完全消失后,键盘才关闭,直到其他键盘的布局被弄乱为止
我确实尝试使用WillPopScope
来确定用户何时弹出路线,但是不幸的是,这禁用了iOS或CupertinoPageRoute
上的滑动弹出功能。
我只是想找出是否有办法确定用户何时从边缘滑动以弹出或点击appBar上的后退按钮并在这样做时关闭键盘。
如果可能的话,我尝试在键盘开始滑动弹出时立即将其关闭,因为许多应用程序中都会发生这种情况。
我正在附上gif,以显示我要达到的效果。
答案 0 :(得分:1)
您需要创建一个扩展NavigatorObserver
的自定义类,并将其实例传递给navigatorObservers
或MaterialApp
的{{1}}属性。
在该自定义类中,您可以覆盖CupertinoApp
和didStartUserGesture
,当滑动手势开始/结束时将调用它们。这应该使您能够实现所需的行为。请注意,didStopUserGesture
指示当前路线以及之前的路线,您可以基于这些路线添加逻辑以确定是否应该关闭键盘。
答案 1 :(得分:0)
这应该自然而然地发生,您不应该直接为此担心,因为实际上,当您在打开键盘的情况下弹出路线时,它应该正确关闭。
但是,如果您想检测用户何时开始滑动并关闭键盘,然后弹出当前路线,则可以使用GestureDetector
将屏幕小部件包裹起来,从而轻松实现: / p>
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...
},
答案 2 :(得分:0)
如奥维迪乌(Ovidiu)所建议
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()],
)
答案 3 :(得分:0)
这是我写的东西来处理这个问题。不使用任何外部包,您只需将内容包装在顶部的 main 函数中即可。
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();
}