4

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

目前,在路线完全弹出之前,键盘不会关闭,从而弄乱了其他一些页面布局,直到它关闭

我确实尝试使用 aWillPopScope来确定用户何时要弹出路由,但不幸的是,这会禁用 iOS 或CupertinoPageRoute.

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

如果可能的话,我会尝试在键盘开始滑动弹出时立即关闭键盘,就像在许多应用程序中一样。

我附上了一个 gif,显示了我想要达到的效果。

滑动弹出隐藏键盘

4

4 回答 4

1

正如奥维迪乌建议的那样

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()],
)
于 2019-08-07T00:25:41.370 回答
1

您需要创建一个扩展的自定义类NavigatorObserver,并将其实例传递给您的or的navigatorObservers属性。MaterialAppCupertinoApp

在该自定义类中,您可以覆盖didStartUserGestureand didStopUserGesture,它将在滑动手势开始/结束时调用。这应该允许您实现您正在寻找的行为。请注意,didStartUserGesture指示当前路线以及先前路线,您可以根据这些路线添加逻辑来确定是否应关闭键盘。

于 2019-08-06T11:10:26.597 回答
0

这应该是自然而然的,你不应该直接关心这一点,因为实际上,当你打开键盘弹出一条路线时,它应该正确地关闭。

但是,如果您想检测用户何时开始滑动并关闭键盘,然后弹出当前路线,您可以通过使用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...
      },
于 2019-07-30T00:29:14.933 回答
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();
}

于 2021-07-29T19:02:16.263 回答