错误详情
Android中集成flutter组件,按照官方文档进行:
// Include the host app project.
include ':app' // assumed existing content
setBinding(new Binding([gradle: this])) // new
evaluate(new File( // new
settingsDir.parentFile, // new
'my_flutter/.android/include_flutter.groovy' // new
)) // new
在按照官方文档操作之后,报错:Failed to apply plugin class ‘FlutterPlugin‘.
解决方案
修改settings.gradle文件
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)//修改这一行代码
repositories {
google()
mavenCentral()
maven { url 'https://storage.googleapis.com/download.flutter.io' }
}
}
rootProject.name = "AndroidFlutterDemo"
include ':app'
setBinding(new Binding([gradle: this])) //new
evaluate(new File( // new
settingsDir.parentFile, // new
'flutter_module/.android/include_flutter.groovy' // new
))
*** 重要,解决方案原理
注意:gradle6.8后 settings.gradle新增了如下配置
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) //主要 是修改这里
repositories {
google()
mavenCentral()
}
}
RepositoriesMode配置在构建中仓库如何设置,总共有三种方式:
FAIL_ON_PROJECT_REPOS
表示如果工程单独设置了仓库,或工程的插件设置了仓库,构建就直接报错抛出异常
PREFER_PROJECT
表示如果工程单独设置了仓库,就优先使用工程配置的,忽略settings里面的
PREFER_SETTINGS
表述任何通过工程单独设置或插件设置的仓库,都会被忽略
settings.gradle里配置了FAIL_ON_PROJECT_REPOS,而Flutter插件又单独设置了repository,所以会构建报错,因此需要把FAIL_ON_PROJECT_REPOS改成PREFER_PROJECT。
repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
但此时Android项目本身没有设置仓库,所有的依赖库都会找flutter module中配置的仓库下载依赖。所以需要在项目build.gradle中添加
//安卓项目/build.gradle
allprojects {
repositories {
google()
mavenCentral()
}
}
重新运行就OK了
参考文档:https://blog.csdn.net/wanggang514260663/article/details/124934520
https://github.com/flutter/flutter/issues/99735