我正在Android上进行测试(我将验证iOS上是否相同)。
我的问题是,当我使用webview显示条纹结帐页面时,如果我点击其中的一个文本输入框以输入底部附近的内容(邮政编码),则虚拟键盘会覆盖webview,并且我无法在webview中向上滚动。
看起来webview像预期的那样占据整个屏幕,但是当软键盘出现时,Flutter通常会为其腾出空间(缩小屏幕上显示的小部件)。 Webview似乎仍然保持相同的大小。
我尝试了一个hack,将webview放在具有动态高度的container()中。 它有点奏效。 以下是代码,关键行是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(),
],
),
);
}
以下是屏幕截图。请注意,在键盘截图中,您甚至无法滚动 Webview 以查看您正在输入的邮政编码...