【问题标题】:Flutter web view doesn't work on release modeFlutter Web 视图在发布模式下不起作用
【发布时间】:2021-04-28 19:00:30
【问题描述】:

我正在创建一个 Flutter 应用程序。

如果我在调试模式下运行此应用程序 webview 运行良好

但如果我在发布模式下运行此应用程序,它会显示空白屏幕。它显示PlatformException

我试图从 github 问题中获得帮助,但找不到解决方案。

清单

<uses-permission android:name="android.permission.INTERNET"/>

build.gradle

minSdkVersion 20
targetSdkVersion 29

pubspec.yaml

webview_flutter: ^1.0.7

错误日志

E/flutter (16872): [ERROR:flutter/lib/ui/ui_dart_state.cc(186)] Unhandled Exception: PlatformException(error, java.lang.IllegalStateException: Trying to create a platform view of unregistered type: plugins.flutter.io/webview
E/flutter (16872):      at io.flutter.plugin.platform.j$a.g(Unknown Source:229)
E/flutter (16872):      at io.flutter.embedding.engine.i.j$a.b(Unknown Source:152)
E/flutter (16872):      at io.flutter.embedding.engine.i.j$a.j(Unknown Source:144)
E/flutter (16872):      at e.a.c.a.j$a.a(Unknown Source:17)
E/flutter (16872):      at io.flutter.embedding.engine.e.b.d(Unknown Source:57)
E/flutter (16872):      at io.flutter.embedding.engine.FlutterJNI.handlePlatformMessage(Unknown Source:4)
E/flutter (16872):      at android.os.MessageQueue.nativePollOnce(Native Method)
E/flutter (16872):      at android.os.MessageQueue.next(MessageQueue.java:335)
E/flutter (16872):      at android.os.Looper.loop(Looper.java:183)
E/flutter (16872):      at android.app.ActivityThread.main(ActivityThread.java:7660)
E/flutter (16872):      at java.lang.reflect.Method.invoke(Native Method)
E/flutter (16872):      at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
E/flutter (16872):      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
E/flutter (16872): , null, null)
E/flutter (16872): #0      StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:581)
E/flutter (16872): #1      MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:158)
E/flutter (16872): <asynchronous suspension>
E/flutter (16872): #2      TextureAndroidViewController._sendCreateMessage (package:flutter/src/services/platform_views.dart:1036)
E/flutter (16872): <asynchronous suspension>
E/flutter (16872): #3      AndroidViewController.create (package:flutter/src/services/platform_views.dart:742)
E/flutter (16872): <asynchronous suspension>
E/flutter (16872): #4      RenderAndroidView._sizePlatformView (package:flutter/src/rendering/platform_view.dart:195)
E/flutter (16872): <asynchronous suspension>

【问题讨论】:

    标签: android flutter flutterwebviewplugin


    【解决方案1】:

    请在您的清单文件中检查“android.permission.INTERNET”权限。在“app/src/main/AndroidManifest.xml”文件夹中。 我使用flutter_inappwebview: ^5.3.2 插件并在发布模式下遇到同样的问题。

    【讨论】:

      【解决方案2】:

      我相信我遇到了同样的问题,发生的事情是,既有已初始化的缓存颤振引擎,也有后来创建的新颤振引擎。

      从那以后,我使用了缓存的颤振引擎,并使用方法通道根据需要进行导航。

      所以在某个地方(可能在您的 MainActivity 或 iOS 等效项中)设置您的缓存 Flutter 引擎:

             val flutterEngine = FlutterEngine(this)
      
              flutterEngine.dartExecutor.executeDartEntrypoint(
                      DartExecutor.DartEntrypoint.createDefault()
              )
      
              FlutterEngineCache
                      .getInstance()
                      .put(INSERT_YOUR_DESIRED_FLUTTER_ENGINE_ID_HERE, flutterEngine)
      

      然后当你想打开你的 FlutterFragment(Android 示例)时:

             var flutterEngine = FlutterEngineCache
                      .getInstance()
                      .get(INSERT_YOUR_FLUTTER_ENGINE_ID_FROM_BEFORE_HERE)
      
             var flutterFragment = FlutterFragment
                     .withCachedEngine(INSERT_YOUR_FLUTTER_ENGINE_ID_FROM_BEFORE_HERE)
                     .build()
      
              MethodChannel(
                      flutterEngine.dartExecutor.binaryMessenger,
                      INSERT_YOUR_DESIRED_METHOD_CHANNEL_NAME_HERE
              ).invokeMethod("setRoute", INSERT_ROUTE_YOU_WANT_HERE)
      
              openFragment(flutterFragment!!)
      

      以及如何在 Flutter Dart 代码中使用此方法通道的示例

      class _MyViewState extends State<MyView> {
      
        static const myMethodChannel = const MethodChannel(INSERT_YOUR_DESIRED_METHOD_CHANNEL_NAME_HERE);
      
        Future<void> _handleMethodCalls(MethodCall call) async {
          switch (call.method) {
            case "setRoute":
              Navigator.pushReplacmentNamed(context, INSERT_YOUR_DESIRED_ROUTE_NAME_HERE)
             ...
          }
        }
      
      ...
      
        @override
        void initState() {
          super.initState();
          platform.setMethodCallHandler(_handleMethodCalls);
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2021-04-08
        • 2021-09-30
        • 2022-08-08
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 2021-07-01
        • 1970-01-01
        • 2020-12-12
        相关资源
        最近更新 更多