繁体   English   中英

在 Flutter 应用程序中通过向后滑动手势关闭键盘

[英]Dismiss keyboard on swipe back gesture in Flutter app

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

目前键盘在路由完全消失之前不会关闭,直到它关闭才会弄乱其他一些页面布局

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

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

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

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

滑动弹出隐藏键盘

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

在该自定义类中,您可以覆盖didStartUserGesturedidStopUserGesture ,它们将在滑动手势开始/结束时调用。 这应该允许您实现您正在寻找的行为。 请注意, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM