Android 集成Flutter模块踩坑之路(对转发的内容做了补充)

原文链接 Android 集成Flutter模块踩坑之路 ,做了最后一点的补充


前言

  最近想在自己项目按照官网集成Flutter模块,这个过程出现很多问题,把这个过程遇见的问题及处理方式做个总结与记录。


1.创建flutter 模块

我的Android Studio版本:2021.1.1
在这里插入图片描述
  这个版本直接使用File -> New -> new module…的方式不能直接创建flutter model官网也提供了好几种方式,这里我选择通过File -> New -> new Flutter Project的方式直接利用Android studio为我们创建module。记得先按照flutter和dart插件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  通过上面图也可以了解,创建module非常简单,只要Project Type 选择module就行,然后改个名字,其他的可以忽略不用惯,module最好跟Android项目在同个目录下,因为我选择的方式是官网推荐的方案 B - 依赖模块的源码的方式来集成module。

依赖方案: 传送门

  当module创建好了之后我们可以按照官网方案B来配置,配置非常简单

在这里插入图片描述

2. Failed to apply plugin class ‘FlutterPlugin’.

  当我们按照官网这样复制上去,然后点击同步时以为万事大吉,结果会出现第一个错误:

Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin class 'FlutterPlugin'.

  
  
   
   

  看错误提示,大概意思是无法应用FlutterPlugin这是什么鬼?经过一番资料查找,原来gradle6.8后 在settings.gradle的dependencyResolutionManagement 下新增了如下配置:

repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

  
  
   
   

这又是什么鬼?经过查找得知其模式有三种:

RepositoriesMode配置在构建中仓库如何设置,总共有三种方式:
FAIL_ON_PROJECT_REPOS
表示如果工程单独设置了仓库,或工程的插件设置了仓库,构建就直接报错抛出异常
PREFER_PROJECT
表示如果工程单独设置了仓库,就优先使用工程配置的,忽略settings里面的
PREFER_SETTINGS
表述任何通过工程单独设置或插件设置的仓库,都会被忽略

  在回头看看我们的代码,settings.gradle里配置的是FAIL_ON_PROJECT_REPOS,Flutter插件又单独设置了repository,所以会构建报错,因此需要把FAIL_ON_PROJECT_REPOS改成PREFER_PROJECT,然后我们编译试试。

果然!编译通过。
切换到project看看,一切正常
在这里插入图片描述
  这里binding会报错,按照提示导入好几种类都不行,这里我直接忽略不管(啥都不导入,且不影响后期),也可以编译通过的,如果有那位知道评论告知我一下
在这里插入图片描述

  本着程序员的谨慎,此时我们肯定会跑一下项目看还有没有问题爆出。就当我在摸鱼的时候以为没错误的时候,果然接踵而至的一大堆错误来袭…
错误原因基本上都是找不到依赖的下载地址,满脑子疑问我不是Google和阿里镜像都配置了怎么还会有这样的问题?
在这里插入图片描述
在这里插入图片描述
找资料和思索了半天,原来是我设置了

repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)的原因

  表示如果工程单独设置了仓库,就优先使用工程配置的(也就是module),从忽略settings里面的,从这句话让我明白了,依赖下载都按照module仓库里配置的下载找。
  因为gradle调整,我们Android仓库配置都在settings.gradle中,但是因为设置了PREFER_PROJECT,settings.gradle被忽略了,现在既然知道原因了,那该怎么解决呢?于是上网查找了一番,发现虽然project的gradle文件虽然调整了,但是依然可以跟之前一样配置仓库这些,于是我就加上了如下所示的配置,成功解决问题并编译安装成功

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        google()
        mavenCentral()
    }
}

  
  
   
   

完整代码如下:
在这里插入图片描述

  为什么要在project.gradle设置上述代码呢?是因为这样配置原生工程会从上述配置拉去代码(正常是从sttings.gradle但是因为设置了PREFER_PROJECT被忽略了),module会从自己的仓库配置拉去依赖,互不相干没有冲突。

总结

  第一个错误是因为settings.gradle做了调整,对这块不是很熟悉所以会造成解决问题比较慢。
  第二个问题也是从第一个问题延申而来的,因为设置了PREFER_PROJECT导致settings.gradle被忽略,从而导致Android项目原本是从settings.gradle所配置的仓库去下载依赖,变成了从module的仓库去下载,从而导致没有下载到需要依赖的包


以上内容转载自: Android 集成Flutter模块踩坑之路。除此之外,还需要在app的build.gradle中添加依赖:

dependencies {
    
    
  implementation project(':flutter')
}

不然会报这样的错误:

在这里插入图片描述


前言

  最近想在自己项目按照官网集成Flutter模块,这个过程出现很多问题,把这个过程遇见的问题及处理方式做个总结与记录。


1.创建flutter 模块

我的Android Studio版本:2021.1.1
在这里插入图片描述
  这个版本直接使用File -> New -> new module…的方式不能直接创建flutter model官网也提供了好几种方式,这里我选择通过File -> New -> new Flutter Project的方式直接利用Android studio为我们创建module。记得先按照flutter和dart插件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  通过上面图也可以了解,创建module非常简单,只要Project Type 选择module就行,然后改个名字,其他的可以忽略不用惯,module最好跟Android项目在同个目录下,因为我选择的方式是官网推荐的方案 B - 依赖模块的源码的方式来集成module。

依赖方案: 传送门

  当module创建好了之后我们可以按照官网方案B来配置,配置非常简单

在这里插入图片描述

2. Failed to apply plugin class ‘FlutterPlugin’.

  当我们按照官网这样复制上去,然后点击同步时以为万事大吉,结果会出现第一个错误:

Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin class 'FlutterPlugin'.

  
  
 
 

  看错误提示,大概意思是无法应用FlutterPlugin这是什么鬼?经过一番资料查找,原来gradle6.8后 在settings.gradle的dependencyResolutionManagement 下新增了如下配置:

repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

  
  
 
 

这又是什么鬼?经过查找得知其模式有三种:

RepositoriesMode配置在构建中仓库如何设置,总共有三种方式:
FAIL_ON_PROJECT_REPOS
表示如果工程单独设置了仓库,或工程的插件设置了仓库,构建就直接报错抛出异常
PREFER_PROJECT
表示如果工程单独设置了仓库,就优先使用工程配置的,忽略settings里面的
PREFER_SETTINGS
表述任何通过工程单独设置或插件设置的仓库,都会被忽略

  在回头看看我们的代码,settings.gradle里配置的是FAIL_ON_PROJECT_REPOS,Flutter插件又单独设置了repository,所以会构建报错,因此需要把FAIL_ON_PROJECT_REPOS改成PREFER_PROJECT,然后我们编译试试。

果然!编译通过。
切换到project看看,一切正常
在这里插入图片描述
  这里binding会报错,按照提示导入好几种类都不行,这里我直接忽略不管(啥都不导入,且不影响后期),也可以编译通过的,如果有那位知道评论告知我一下
在这里插入图片描述

  本着程序员的谨慎,此时我们肯定会跑一下项目看还有没有问题爆出。就当我在摸鱼的时候以为没错误的时候,果然接踵而至的一大堆错误来袭…
错误原因基本上都是找不到依赖的下载地址,满脑子疑问我不是Google和阿里镜像都配置了怎么还会有这样的问题?
在这里插入图片描述
在这里插入图片描述
找资料和思索了半天,原来是我设置了

repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)的原因

  表示如果工程单独设置了仓库,就优先使用工程配置的(也就是module),从忽略settings里面的,从这句话让我明白了,依赖下载都按照module仓库里配置的下载找。
  因为gradle调整,我们Android仓库配置都在settings.gradle中,但是因为设置了PREFER_PROJECT,settings.gradle被忽略了,现在既然知道原因了,那该怎么解决呢?于是上网查找了一番,发现虽然project的gradle文件虽然调整了,但是依然可以跟之前一样配置仓库这些,于是我就加上了如下所示的配置,成功解决问题并编译安装成功

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/repository/public' }
        maven { url 'https://maven.aliyun.com/repository/google' }
        maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
        google()
        mavenCentral()
    }
}

  
  
 
 

完整代码如下:
在这里插入图片描述

  为什么要在project.gradle设置上述代码呢?是因为这样配置原生工程会从上述配置拉去代码(正常是从sttings.gradle但是因为设置了PREFER_PROJECT被忽略了),module会从自己的仓库配置拉去依赖,互不相干没有冲突。

总结

  第一个错误是因为settings.gradle做了调整,对这块不是很熟悉所以会造成解决问题比较慢。
  第二个问题也是从第一个问题延申而来的,因为设置了PREFER_PROJECT导致settings.gradle被忽略,从而导致Android项目原本是从settings.gradle所配置的仓库去下载依赖,变成了从module的仓库去下载,从而导致没有下载到需要依赖的包

猜你喜欢

转载自blog.csdn.net/qq_36162336/article/details/129854348