首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Flutter:尝试在FlutterEngine中自动注册插件,但未能找到并调用GeneratedPluginRegistrant

Flutter:尝试在FlutterEngine中自动注册插件,但未能找到并调用GeneratedPluginRegistrant
EN

Stack Overflow用户
提问于 2020-07-09 18:42:58
回答 5查看 12.8K关注 0票数 11

在运行以下命令时,我会得到这些错误

代码语言:javascript
运行
复制
flutter run --flavor development -t lib/config/main_development.dart --verbose-system-logs

错误:

代码语言:javascript
运行
复制
Tried to automatically register plugins with FlutterEngine (io.flutter.embedding.engine.FlutterEngine@b5226bb) but could not find and invoke the GeneratedPluginRegistrant.
代码语言:javascript
运行
复制
E/flutter (28896): [ERROR:flutter/lib/ui/ui_dart_state.cc(166)] Unhandled Exception: MissingPluginException(No implementation found for method initialize on channel flutter_stetho)

颤振医生输出:

代码语言:javascript
运行
复制
➜ flutter doctor -v                                                                         
[✓] Flutter (Channel master, 1.20.0-8.0.pre.22, on Mac OS X 10.14.6 18G3020, locale en)
    • Flutter version 1.20.0-8.0.pre.22 at /Users/vedantrathore/tools/flutter
    • Framework revision 61a04b1551 (11 hours ago), 2020-07-09 15:52:19 +0800
    • Engine revision 0ec6f6c3f2
    • Dart version 2.9.0 (build 2.9.0-20.0.dev 06cb010247)

 
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.3)
    • Android SDK at /Users/vedantrathore/Library/Android/sdk
    • Platform android-29, build-tools 29.0.3
    • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 11.3.1)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Xcode 11.3.1, Build version 11C504
    • CocoaPods version 1.9.1

[✓] Android Studio (version 3.6)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin version 44.0.2
    • Dart plugin version 192.7761
    • Java version OpenJDK Runtime Environment (build 1.8.0_212-release-1586-b4-5784211)

[✓] VS Code (version 1.46.1)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.12.1

[✓] Connected device (1 available)
    • GM1901 (mobile) • 192.168.29.75:5555 • android-arm64 • Android 10 (API 29)

• No issues found!

这是我的应用程序/build.gradle文件

代码语言:javascript
运行
复制
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '1'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0'
}

apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion 28

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    lintOptions {
        disable 'InvalidPackage'
    }

    defaultConfig {
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        applicationId "com.habitwave"
        minSdkVersion 18
        targetSdkVersion 28
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
            minifyEnabled true
            useProguard true
        }
        debug{
            minifyEnabled true
            useProguard true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    flavorDimensions "flutter-flavours"

    productFlavors{
        development{
            dimension "flutter-flavours"
            versionNameSuffix "-dev"
        }
        staging{
            dimension "flutter-flavours"
            versionNameSuffix "-stg"
        }
        production{
            dimension "flutter-flavours"
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

    implementation 'com.google.firebase:firebase-analytics:17.2.2'
}

我正在尝试使用flutter_secure_storage包,因此我必须将minSdkVersion设置为18,并使用Proguard规则来避免multiDex (因为这需要minSdkVersion 21)

我尝试过的解决方案:

运行~/.pub-cache

  • Moving的
  • 运行flutter clean,卸载应用程序,将

清除到主通道

编辑

我深入解决了这个问题,在Android中打开了这个应用程序,进入了实现颤振活动,并设置了一个断点,它试图注册插件,当我运行应用程序时,我发现错误是FacebookSdk没有初始化。我使用的是pub.dev/packages/flutter_facebook_login包,忘记了android初始化。可以改进错误处理以适应这些情况。

EN

回答 5

Stack Overflow用户

发布于 2020-07-11 00:01:19

今天我也面临着同样的问题。我认为这与此有关:https://flutter.dev/docs/development/packages-and-plugins/plugin-api-migration

(这可能只是暂时的解决方案)我将注册人写回我的MainActivity.kt --如果您的类体是空的,它可能会有所帮助。

代码语言:javascript
运行
复制
package your.package.name

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() {
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine);
    }
}
票数 5
EN

Stack Overflow用户

发布于 2020-12-02 20:44:40

我今天也面临着同样的问题。这个答案对于那些在开发Android插件时发现这个错误的人来说是有帮助的。

此错误是由于插件初始化时发生的InvocationTargetException造成的。当使用反射调用的方法抛出错误时,将引发InvocationTargetException。除了“尝试自动注册插件.”之外,没有任何错误日志。颤振警告,所以我已经发现了异常时,首先调试颤振源代码(也由OP)和我的代码之后。

这是抛出异常的颤振源代码。(按颤振计1.20.4/通道:稳定)

代码语言:javascript
运行
复制
private static void registerPlugins(@NonNull FlutterEngine flutterEngine) {
  try {
    Class<?> generatedPluginRegistrant =
        Class.forName("io.flutter.plugins.GeneratedPluginRegistrant");
    Method registrationMethod =
        generatedPluginRegistrant.getDeclaredMethod("registerWith", 
FlutterEngine.class);
    registrationMethod.invoke(null, flutterEngine);
  } catch (Exception e) {
    Log.w(
        TAG,
        "Tried to automatically register plugins with FlutterEngine ("
            + flutterEngine
            + ") but could not find and invoke the GeneratedPluginRegistrant.");
  }
}

我已经将注释添加到可能导致此错误的方法中。您可以使用Android调试代码,并找到插件初始化失败的错误。

代码语言:javascript
运行
复制
public class MyPlugin implements FlutterPlugin, ActivityAware {
    private MethodChannel methodChannel;
    private CustomMethodHandler methodHandler;
    private ActivityPluginBinding mActivityBinding;

    private void initChannels(final BinaryMessenger messenger) {
        methodChannel = new MethodChannel(messenger, Channel.MY_METHOD_CHANNEL);
        methodHandler= new CustomMethodHandler(null);
        methodChannel.setMethodCallHandler(authMethodHandler);
    }

    private void teardownChannels() {
        methodChannel.setMethodCallHandler(null);
        methodChannel = null;
    }

    private void setupActivity(Activity activity) {
        methodChannel.setActivity(activity);
    }

    private void teardownActivity() {
        methodChannel.setActivity(null);
    }

    @Override
    public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
        // Debug here for errors.
        initChannels(flutterPluginBinding.getBinaryMessenger());
    }

    public static void registerWith(Registrar registrar) {
        MyPlugin myPlugin = new MyPlugin();
        myPlugin.initChannels(registrar.messenger());
        myPlugin.setupActivity(registrar.activity());
    }

    @Override
    public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {
        teardownChannels();
    }

    @Override
    public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
        // Debug here for errors.
        mActivityBinding = binding;
        setupActivity(mActivityBinding.getActivity());
    }

    @Override
    public void onDetachedFromActivityForConfigChanges() {
        teardownActivity();
    }

    @Override
    public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {
        mActivityBinding = binding;
        setupActivity(mActivityBinding.getActivity());
    }

    @Override
    public void onDetachedFromActivity() {
        teardownActivity();
    }

}
票数 2
EN

Stack Overflow用户

发布于 2020-09-15 08:43:22

我已将此用于Firebase通知和本地通知

您可以像这样手动注册插件:-

Application.java

代码语言:javascript
运行
复制
package com.example.appname;
import io.flutter.app.FlutterApplication;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;
import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void onCreate() {
    super.onCreate();
    FlutterFirebaseMessagingService.setPluginRegistrant(this);
  }

  @Override
  public void registerWith(PluginRegistry registry) {
    FirebaseCloudMessagingPluginRegistrant.registerWith(registry);
  }
}

MainActivity.java

代码语言:javascript
运行
复制
package com.example.appname;

import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugins.GeneratedPluginRegistrant;

public class MainActivity extends FlutterActivity {
 @Override
 public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
   GeneratedPluginRegistrant.registerWith(flutterEngine);
 }
}

FirebaseCloudMessagingPluginRegistrant.java

代码语言:javascript
运行
复制
package com.example.appname;
import com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;

public final class FirebaseCloudMessagingPluginRegistrant{
  public static void registerWith(PluginRegistry registry) {
    if (alreadyRegisteredWith(registry)) {
      return;
    }
    FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
    FlutterLocalNotificationsPlugin.registerWith(registry.registrarFor("com.dexterous.flutterlocalnotifications.FlutterLocalNotificationsPlugin"));
  }

  private static boolean alreadyRegisteredWith(PluginRegistry registry) {
    final String key = FirebaseCloudMessagingPluginRegistrant.class.getCanonicalName();
    if (registry.hasPlugin(key)) {
      return true;
    }
    registry.registrarFor(key);
    return false;
  }
}

您必须对app/src/main/AndroidManifest.xml进行一些更改。

代码语言:javascript
运行
复制
<application android:name=".Application"
<activity android:name=".MainActivity" 

只需更改应用程序名称和活动名称,rest在AndroidManifest.xml中是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62821618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档