5

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

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

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

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

显现

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

构建.gradle

minSdkVersion 20
targetSdkVersion 29

发布规范.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>
4

3 回答 3

1

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

于 2021-06-01T13:07:52.033 回答
0

我认为您没有在 android/app/src/main/ AndroidManifest.xml中授予互联网权限

将此行添加到android/app/src/main/ AndroidManifest.xml的<manifest

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

平台不允许使用 Flutter Insecure http 的更多信息,您可以查看讨论

<uses-permission android:name="android.permission.INTERNET" /> //This line add
<application
    android:name="io.demo.app.test"
    android:label="ProjectName"
    android:usesCleartextTraffic="true" //This line add
    android:icon="@mipmap/ic_launcher">
于 2022-01-31T18:11:18.697 回答
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)

然后当你想打开你的 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-03-16T00:57:41.693 回答