在Flutter应用中以向后滑动手势关闭键盘

时间:2019-07-29 23:56:04

标签: flutter dart flutter-navigation

当用户从边缘滑动以弹出路线时,我试图关闭键盘。

当前,直到路线完全消失后,键盘才关闭,直到其他键盘的布局被弄乱为止

我确实尝试使用WillPopScope来确定用户何时弹出路线,但是不幸的是,这禁用了iOS或CupertinoPageRoute上的滑动弹出功能。

我只是想找出是否有办法确定用户何时从边缘滑动以弹出或点击appBar上的后退按钮并在这样做时关闭键盘。

如果可能的话,我尝试在键盘开始滑动弹出时立即将其关闭,因为许多应用程序中都会发生这种情况。

我正在附上gif,以显示我要达到的效果。

Swipe to pop hides keyboard

4 个答案:

答案 0 :(得分:1)

您需要创建一个扩展NavigatorObserver的自定义类,并将其实例传递给navigatorObserversMaterialApp的{​​{1}}属性。

在该自定义类中,您可以覆盖CupertinoAppdidStartUserGesture,当滑动手势开始/结束时将调用它们。这应该使您能够实现所需的行为。请注意,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();
}