Flutter:MainActivity在Java Native代码中无法转换为FlutterEngine

17

我正在尝试使用Java为Flutter创建一个插件。我试图在我的主要Java类中传递Android activity参数。

这是我的本地代码:

package com.example.trsurveys;

import androidx.annotation.NonNull;
import android.app.Activity;

import io.flutter.embedding.engine.plugins.FlutterPlugin;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
import io.flutter.plugin.common.MethodChannel.Result;
import io.flutter.plugin.common.PluginRegistry.Registrar;

import theoremreach.com.theoremreach.TheoremReach;


public class TrsurveysPlugin implements FlutterPlugin, MethodCallHandler {
  private MethodChannel channel;
  private Registrar registrar;
  private Activity activity;

  @Override
  public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
    channel = new MethodChannel(flutterPluginBinding.getFlutterEngine().getDartExecutor(), "trsurveys");
    channel.setMethodCallHandler(this);
  }

When I try to debug my app it shows me the following errors

    private TrsurveysPlugin(Activity activity) {
        this.activity = activity;
    }

  public static void registerWith(Registrar registrar) {
    final MethodChannel channel = new MethodChannel(registrar.messenger(), "trsurveys");
    channel.setMethodCallHandler(new TrsurveysPlugin(registrar.activity()));
  }

  @Override
  public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
    if (call.method.equals("init")) {
      String apiKey = call.argument("apiKey");
      TheoremReach.initWithApiKeyAndUserIdAndActivityContext(apiKey, "USER_ID", activity);
    }
  }

  @Override
  public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
    channel.setMethodCallHandler(null);
  }
}

当我尝试调试我的应用程序时,我会收到以下错误信息:

error: constructor TrsurveysPlugin in class TrsurveysPlugin cannot be applied to given types;
    flutterEngine.getPlugins().add(new com.example.trsurveys.TrsurveysPlugin());
                                   ^
  required: Activity
  found: no arguments
  reason: actual and formal argument lists differ in length

...path/Downloads/TheoremReach-error/example/android/app/src/main/java/com/example/trsurveys_example/MainActivity.java:11: error: incompatible types: MainActivity cannot be converted to FlutterEngine
    GeneratedPluginRegistrant.registerWith(this);
                                       ^

这是出现在我的GeneratedPluginRegistrant.java文件中的代码。

package io.flutter.plugins;

import androidx.annotation.Keep;
import androidx.annotation.NonNull;

import io.flutter.embedding.engine.FlutterEngine;

@Keep
public final class GeneratedPluginRegistrant {
  public static void registerWith(@NonNull FlutterEngine flutterEngine) {
    flutterEngine.getPlugins().add(new com.example.trsurveys.TrsurveysPlugin());
  }
}

在制作插件时,我尝试删除GeneratedPluginRegistrant.java文件,但每次它都会以相同的配置生成。


这个问题有什么进展吗? - Akif
3个回答

10

当我将一个仓库从较旧的Flutter版本升级到新版本时,出现了这种情况。我按照官方的flutter链接进行了迁移。

我在android清单文件上进行了适当的更改。具体地:

  1. <application> 标签中删除 android:name 属性
  2. 将单个 <activity>android:name 更改为 android:name="io.flutter.embedding.android.FlutterActivity"
  3. 添加 <meta-data android:name="flutterEmbedding" android:value="2"/> 作为 <application> 标签的子标签

然而,我没有在 MainActivity 上更改任何代码,这导致了错误。 MainActivity 使用了较旧的导入,与上述三个更改不兼容。

最终的清单文件:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="co.appbrewery.magic8ball">
<uses-permission android:name="android.permission.INTERNET"/>
<application
    android:label="magic_8_ball"
    android:icon="@mipmap/ic_launcher">
    <activity
        android:name="io.flutter.embedding.android.FlutterActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">
        <meta-data android:name="flutterEmbedding" android:value="2"/>
        <meta-data
            android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
            android:value="true" />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>
</application>

删除MainActivity对我来说解决了这个问题。


对我也起作用了!很高兴看到另一个和我一样在尝试应对相同Flutter课程的伙计 :) - Anton Ogarkov

1

打开您的项目清单文件并删除这些行。

meta-data
android:name=”flutterEmbedding”
android:value=”2″

然后再构建和运行它。

4
删除这些代码行后,我遇到了另一个错误。 - Mayur Agarwal

0
我已经通过以下步骤解决了这个问题: 前往android-> app-> src-> main-> java-> com->(您的包名)-> MainActivity.java。现在注释掉这行代码:
public class MainActivity extends FlutterActivity {
  /*@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this);
  }*/

现在你的MainActivity看起来是这样的:

import io.flutter.embedding.android.FlutterActivity;
public class MainActivity extends FlutterActivity {
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接