在 android 库中添加 Flutter 功能作为依赖项

Add Flutter functionality as a dependency in android library

为什么我需要这个?

我正在创建一个 Flutter 包(用于 android),我想在一个单独的 AAR 文件中创建 MethodCallHandler 的代码,该文件可以添加到我的插件代码中

所以我要:

import ir.malv.android.flutter.MySeparateMethodCallHandler

class MyFlutterPlugin: FlutterPlugin {
   override fun onAttachedToEngine(...) {
      // Here's the source of the problem
      channel.setMethodCallHandler(MySeparateMethodCallHandler()) 
   }
}

MySeparateMethodCallHandler 不在 plugin/android 部分,它作为 gradle 依赖项导入

但是在那个库中我无法访问像 MethodCallHandler class.

这样的 flutter 代码

Unity 和 React Native 中的相似行为

In react-native there is com.facebook.react:react-native:+ that can be added as compileOnly to get the needed react-native codes

In unity we have unity.jar file which contains unity native codes and can be added as compileOnly as well to provide engine's native APIs

我们在 Flutter 中为此做了什么?

是否有我可以包含为 compileOnly 的依赖项并使用它来获取所需的 classes 并在单独的项目中创建我的 aar 文件?

这是一个解决方案:

  1. 将此遥控器添加到 build.gradlerepositories
allprojects {
  repositories {
    // .. rest of remote urls

    maven { url("http://download.flutter.io/")}
  }
}
  1. 将此依赖项添加到模块的 build.gradle
dependencies {
  
  compileOnly("io.flutter:flutter_embedding_debug:1.0.0-0fdb562ac8068ce3dda6b69aca3f355f4d1d2718")

  // rest
}

注意 compileOnly。这将避免 class 重复。插件只需要它。 flutter 应用程序将自行提供。

What is 0fdb562ac8068ce3dda6b69aca3f355f4d1d2718?
It's the engine version that is good to match the version you are developing the plugin with.

在您的代码中,您将可以访问所需的 class,例如 MethodChannelMethodChannel.Result 和 ...


奖励:我怎么知道我用什么引擎制作插件?

我认为如果你只需要一个像 MethodChannel 这样的 class 来调用一个方法应该没关系,但这里有一种方法可以使用 Android Studio

  • 使用 Android studio 打开插件的 project/example/android(已激活 Flutter 插件)
  • 运行 gradle plugin_name:dependencies 任务并查找 flutter_embedding_ 短语。