【问题标题】:Flutter WebView soft keyboard does not hide on input blurFlutter WebView 软键盘在输入模糊时不隐藏
【发布时间】:2020-04-09 16:10:48
【问题描述】:

Android 上的 Flutter Webview 插件似乎存在一个长期存在的问题 - 如果 this discussion 可以通过。我也遇到过 - 在 Webview 对话框中,我有一个输入框,当聚焦时会导致 Android 软键盘出现。但是,当该输入框失去焦点时,它不会随后自行消失 - 甚至当它从 DOM 树中删除时也是如此。对于任何能够提出解决方案的人,我将非常感激。我已经尝试了该讨论中提到的各种想法,包括从后面的 Dart 代码发出 SystemChannels.textInput.invokeMethod('TextInput.hide');

我能想到的唯一另一种方法是编写一个小的 Flutter Android“插件”,它试图通过我认为应该可以工作的 Android API 直接隐藏软键盘。如果有人能指出我执行此操作所需的 Kotlin 代码,我将不胜感激。


这是我构建应用程序 UI 的方式 - 整个 Widget 树

Route makeWebView(RouteSettings settings)
{
 return new PageRouteBuilder
 (
  pageBuilder:(BuildContext context,Animation<double> 
  animation,Animation<double> secondaryAnimation)
  {
   return SafeArea
   (
    child:Listener
    (
     child: SizedBox.expand
     (
      child:WebView
      (
       debuggingEnabled:true, 
       initialUrl:'',
       javascriptMode:JavascriptMode.unrestricted,
       onWebViewCreated:registerController,
       javascriptChannels:Set.from
      ([JavascriptChannel(name:'JSBridge',
                              onMessageReceived:handleMessage)]),
       ),
      ),
     )
    );
  });
 }

【问题讨论】:

  • 请分享您的小部件树,您将 WebView 添加到小部件树的位置和方式...
  • 我已经修改了我的问题。我应该提一下,我从 WidgetsApp 开始,而不是 MaterialApp

标签: android flutter android-softkeyboard blur


【解决方案1】:

根据https://github.com/flutter/flutter/issues/36478#issuecomment-708076118,修复终于出来了,我已经测试过了。它有效。

要启用修复,您需要启用混合合成,即:SurfaceAndroidWebView

import 'dart:io';

import 'package:webview_flutter/webview_flutter.dart';

class WebViewExample extends StatefulWidget {
  @override
  WebViewExampleState createState() => WebViewExampleState();
}

class WebViewExampleState extends State<WebViewExample> {
  @override
  void initState() {
    super.initState();
    // Enable hybrid composition.
    if (Platform.isAndroid) WebView.platform = SurfaceAndroidWebView();
  }

  @override
  Widget build(BuildContext context) {
    return WebView(
      initialUrl: 'https://flutter.dev',
    );
  }
}

SurfaceAndroidWebView() 需要 API 级别 19。插件本身并不强制执行 API 级别,因此如果您想让应用在运行此 API 级别或更高级别的设备上可用,请将以下内容添加到 /android/app/build .gradle:

android {
    defaultConfig {
        // Required by the Flutter WebView plugin.
        minSdkVersion 19
    }
  }

文档链接:https://pub.dev/packages/webview_flutter#using-hybrid-composition

【讨论】:

    猜你喜欢
    • 2021-07-20
    • 2014-04-07
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多