• 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'.
    
    • 1

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

    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    
    • 1

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

    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()
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    总结

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

  • 相关阅读:
    一文就懂HashMap原理!学不会你来砍我!
    GFS分布式文件系统概述以及集群部署
    “玄学+社交+AI”最全解题思路,融云 AI 对话方案全力支持
    为什么我学了几天 STM32 感觉一脸茫然?
    实验2 Python数字类型实验
    Linux/macOS如何更改主机名hostname?
    vivo z1换电池笔记
    Krustral算法求解最小生成树 C++实现
    USRP-2944 配件讲解,如何选择对应的配件
    【云原生】Kubernetes临时容器
  • 原文地址:https://blog.csdn.net/qq_40616261/article/details/126679944