Flutter Web 视图在发布模式下不起作用

Vik*_*uli 12 android flutter flutterwebviewplugin

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

如果我在调试模式下运行这个应用程序,webview效果很好

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

我尝试从 github issues 获取帮助,但找不到解决方案。

显现

<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)

构建.gradle

minSdkVersion 20
targetSdkVersion 29
Run Code Online (Sandbox Code Playgroud)

pubspec.yaml

webview_flutter: ^1.0.7
Run Code Online (Sandbox Code Playgroud)

错误日志

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>
Run Code Online (Sandbox Code Playgroud)

小智 5

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


小智 0

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

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

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

       val flutterEngine = FlutterEngine(this)

        flutterEngine.dartExecutor.executeDartEntrypoint(
                DartExecutor.DartEntrypoint.createDefault()
        )

        FlutterEngineCache
                .getInstance()
                .put(INSERT_YOUR_DESIRED_FLUTTER_ENGINE_ID_HERE, flutterEngine)
Run Code Online (Sandbox Code Playgroud)

然后当你想打开你的 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!!)
Run Code Online (Sandbox Code Playgroud)

以及如何在 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);
  }

}
Run Code Online (Sandbox Code Playgroud)