Flutter webview 文本输入被软键盘隐藏

2024-01-04

我正在 Android 上进行测试(我将验证它在 iOS 上是否相同)。

我的问题是,当我有一个显示条纹结帐页面的网页视图,并且我点击那里的文本条目以输入靠近底部(邮政编码)的内容时,虚拟键盘会覆盖网页视图,即使在网页视图。

看起来 webview 按预期占据了整个屏幕,但是当软键盘出现时 Flutter 我认为通常会为其腾出空间(缩小屏幕上显示的小部件)。 Webview 似乎保持相同的大小。

我尝试了一种将网络视图放入具有动态高度的容器()中的技巧。它有点有效。代码如下,关键行是Container()的高度:

height: MediaQuery.of(context).size.height * (MediaQuery.of(context).viewInsets.bottom != 0 ? .7 : 1)

但这会导致键盘混乱。例如,它以某种方式欺骗键盘,使其不成为邮政编码的数字输入类型。它看起来像是在尝试,但在一瞬间就重新绘制到非数字键盘。

为什么Webview不支持手机上的软键盘?

这是我在有状态小部件中的构建:

  @override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Stack(
        children: [
          initialUrl == null
              ? Container()
              : Container(
                  height: MediaQuery.of(context).size.height * (MediaQuery.of(context).viewInsets.bottom != 0 ? .7 : 1),
                  child: WebView(
                    initialUrl: initialUrl,
                    javascriptMode: JavascriptMode.unrestricted,
                    onPageStarted: (controller) {},
                    onPageFinished: (controller) {
                      Future.delayed(Duration(milliseconds: 1234), () {
                        if (mounted) {
                          showLoading = false;
                          setState(() {});
                        }
                      });
                    },
                    navigationDelegate: (NavigationRequest request) {
                      if (request.url.startsWith('https://example.com/success')) {
                        Navigator.of(context).pop('success');
                      } else if (request.url.startsWith('https://example.com/cancel')) {
                        Navigator.of(context).pop('cancel');
                      }
                      return NavigationDecision.navigate;
                    },
                  ),
                ),
          showLoading == true
              ? Center(
                  child: Container(width: 80, height: 80, child: CircularProgressIndicator()),
                )
              : Container(),
        ],
      ),
    );
  }

这是屏幕截图。请注意,在键盘中,您甚至无法滚动网络视图来查看您正在输入的 zip...


对我来说,答案有两件事。

首先使用这条线设置WebView.platform在显示 web 视图的有状态小部件内。请注意,这是我当时在 Android 上进行的测试所特有的,所以也许对于你们中的一些人来说,当您没有看到该问题时,您可能是在 iOS 上?

  @override
  void initState() {
    super.initState();
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView(); // <<== THIS
  }

其次我添加了一个脚手架resizeToAvoidBottomInset设置为 true 并删除我对此的使用:

height: MediaQuery.of(context).size.height * (MediaQuery.of(context).viewInsets.bottom != 0 ? .7 : 1),`

这是带有 webview 的 body 的代码

@override
  Widget build(BuildContext context) {
    return SafeArea(
      child: Stack(
        children: [
          initialUrl == null
              ? Container()
              : Scaffold(
                resizeToAvoidBottomInset: true,
                body: WebView(
                  initialUrl: initialUrl,
                  javascriptMode: JavascriptMode.unrestricted,
                  onPageStarted: (controller) {},
                  onPageFinished: (controller) {
                    Future.delayed(Duration(milliseconds: 1234), () {
                      if (mounted) {
                        showLoading = false;
                        setState(() {});
                      }
                    });
                  },
                  navigationDelegate: (NavigationRequest request) {
                    if (request.url.startsWith('https://example.com/success')) {
                      Navigator.of(context).pop('success');
                    } else if (request.url.startsWith('https://example.com/cancel')) {
                      Navigator.of(context).pop('cancel');
                    }
                    return NavigationDecision.navigate;
                  },
                ),
              ),
          showLoading == true
              ? Center(
                  child: Container(width: 80, height: 80, child: CircularProgressIndicator()),
                )
              : Container(),
        ],
      ),
    );
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter webview 文本输入被软键盘隐藏 的相关文章

随机推荐

  • 蓝兹编程

    我正在使用 USB 蓝牙适配器在 Raspberry Pi 上使用 BlueZ 进行编程 我需要能够以编程方式连接到 Arduino BT 问题是 Arduino 的蓝牙模块仍在使用传统配对 因此每当我尝试打开设备的套接字时 我都会收到Pe
  • 如何在Python中计算mod b?

    Python中有取模函数吗math图书馆 Isn t 15 4 3 但15 mod 4是1 对吗 有的是 符号 它不仅仅是求余数 而是求模运算
  • 尽管提供了 Twitter Api,回调 URL 仍未获得批准

    在 Twitter 控制台中 我有一个来自 firebase 的回调 url 链接 然而 当我尝试使用 twitter 进行身份验证时 出现错误 Request failed forbidden 403 UserInfo NSLocaliz
  • Gradle eclipse classpath - 在快照和项目依赖之间切换

    我们的 Java 项目中有多个模块 每个模块都会将 SNAPSHOT jar 文件发布到 Nexus 存储库 所有子模块都直接依赖于 SNAPSHOT jar 文件 在开发过程中 我们希望依赖 Eclipse 项目而不是 SNAPSHOT
  • boost::flat_map 及其与 map 和 unordered_map 相比的性能

    编程中的常识是 由于缓存命中 内存局部性可以大大提高性能 我最近发现boost flat map这是基于矢量的地图实现 它似乎并不像典型的那样受欢迎map unordered map所以我没能找到任何性能比较 它的比较如何 它的最佳用例是什
  • 递归地从 XML 中删除空节点

    我想从 XML 元素中删除空节点 该 xml 是由供应商生成的 我无法控制 xml 的生成 但由于 XML 几乎没有空节点 我需要递归删除这些空节点 这个 xml 是从 OMElement 获取的 我使用 XMLUtils 1 从这个对象获
  • 在 Java 中转换 StAX 源

    我有一些代码 例如 XMLInputFactory xif XMLInputFactory newInstance TransformerFactory tf TransformerFactory newInstance org apach
  • 使用 ffmpeg 合并视频

    我尝试过这个命令 ffmpeg i concat 10 mov 11 mov codec copy out mov输出文件 out mov 仅显示第一部电影 10 mov 中的内容 谷歌搜索了几个小时并尝试了很多东西但没有任何效果 我希望在
  • spring boot cloud eureka windows 10 eureka 在最新的 docker 升级后返回 host.docker.internal 作为客户端主机名

    Spring Boot Cloud Disovery 问题 在 Windows 10 上进行 docker 升级后 Eureka 主机名出现问题 注意 docker 不托管 spring 服务 仅托管 mariadb rabbitmq 和
  • cudamemcpyasync 和流行为理解

    我有下面所示的简单代码 它什么也不做 只是使用流将一些数据从主机复制到设备 但在运行 nvprof 后我很困惑 因为 cudamemcpyasync 确实是异步的并且对流的理解 include
  • Discord4J:不存在类型变量 R 的实例,因此 void 符合 Mono

    我有以下错误no instance s of type variable s R exist so that void conforms to Mono
  • 使用 Lodash 删除数组中的元素

    我有这个数组 var fruits Apple Banana Orange Celery 我用Lodash的remove像这样 remove fruits function fruit return fruit Apple Banana O
  • 错误:输入网格不是有效的网格

    我有个问题 所以我有一个 XxYxZ 10x5x20 的 3D 矩阵 我想在等值面的帮助下绘制这个矩阵 因此 首先我需要创建一个网格 但是当我说时 第一个问题就出现了 X Y Z meshgrid 1 10 1 5 1 20 我得到一个 5
  • 如何使用 Kotlin 在 Android 中动态添加按钮

    如何使用 Kotlin 在 Android 中动态添加按钮 我是 Kotlin 新手 请帮忙 您可以通过调用按钮的构造函数来动态创建按钮 var myButton Button this 这 将是活动
  • 解析 FlightRadar24 和 JSOUP

    大家好 我想在 Flightradar24 com 上解析航班 我尝试过 JSOUP 和 Android 但结果为空 http postimg org image 6hdmp4hgv http postimg org image 6hdmp
  • Docker-compose 与 podman 一起使用?

    如何在 podman 中使用 docker compose 文件 这个例子 version 3 7 services gitea image gitea gitea latest environment DB TYPE postgres D
  • 源代码保护

    当您使用 Visual Studio 2010 编译要发布的程序时 是否有任何高级方法可以使您的程序反编译为源代码 在编译之前有什么方法可以用来加密源代码吗 默认情况下 Visual Studio 不会应用任何形式的增强功能 也不会修改除所
  • 从 JUnit 单元测试设置 android.location.Location 对象的参数

    我正在尝试对接收 android location Location 对象的函数进行单元测试 但我阻止了 因为我无法为位置对象设置参数 Test public void testLocation Location location new
  • Ubuntu 11.04 上的 Rails 3.1 通过 RVM - 未初始化的常量 Psych::Syck

    gem install rails pre ERROR While executing gem NameError uninitialized constant Psych Syck 我似乎找不到任何有关如何解决此问题的信息 还有其他人遇到
  • Flutter webview 文本输入被软键盘隐藏

    我正在 Android 上进行测试 我将验证它在 iOS 上是否相同 我的问题是 当我有一个显示条纹结帐页面的网页视图 并且我点击那里的文本条目以输入靠近底部 邮政编码 的内容时 虚拟键盘会覆盖网页视图 即使在网页视图 看起来 webvie