likes
comments
collection
share

Flutter混合开发实战(一)项目导入

作者站长头像
站长
· 阅读数 5

前言

首先得说明一下为什么要学习flutter和原生混合开发,起因是我之前面试了某大厂,本来一切都进行得很顺利,直到面试官问了我一句:“你有过混合开发的经验吗?”。我顿时呆住了,内心OS:我大flutter蒸蒸日上,遥遥领先,为啥要学混合开发。当然表面我只能硬着头皮说没有...不出意料的过了段时间我收到了邮件说我面试没有通过。所幸之前在面试结束时我问了面试官:“您觉得我哪方面需要补足一下?”,面试官当时愣了一会,然后说:“我觉得你可以学习一下混合开发,毕竟纯flutter是没有出路的。”,OMG我大flutter居然没有出路,刹那间我仿佛五雷轰顶,外焦里嫩,本来以为只要学会flutter,就能等着它自己发展壮大坐收渔利,没想到现实给了我沉痛一击。后来我在boss上浏览了大部分flutter岗位要求,有七八成是要求掌握java、kotlin、swift等语言的,剩下的也基本要求有相关原生经验。自此我便踏上了混合开发之路...

一、原生引入flutter模组

1、首先创建flutter module,这一步没什么好说的,模组项目注意要和原生项目同级目录,创建flutter项目的时候把这里的类型改成Module就欧了

Flutter混合开发实战(一)项目导入

2、在原生项目的project目录下找到settings.gradle文件,将以下代码复制进去,注意把fluttermix改成flutter模组的项目名,这里有个大佬写的是settingsDir.parentFile,但是我写进去后报错了,改成这样才能运行,报错的朋友可以改一下

setBinding(new Binding([gradle: this]))
evaluate(new File(
        settingsDir.parentFile,
        'fluttermix/.android/include_flutter.groovy'
))

app级目录下找到build.gradle文件,在dependencies中添加依赖

implementation project(':flutter')

补充说明一下,做完以上步骤sync时有人会报错(才不是我),大概率是jdk版本和gradle版本冲突导致的,也有可能是flutter sdk冲突,这时候最好上google找一下解决方法,国内这搜索引擎实在是一言难尽...还有最好把模组也单独跑一下,可能会遇到换源、gradle版本问题

3、先试试能不能运行起来,如果可以再进行以下步骤

在原生项目AndroidManifest文件的application层级里导入FlutterActivity

<activity
    android:name="io.flutter.embedding.android.FlutterActivity"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:windowSoftInputMode="adjustResize"
    />

4、随便在一个点击事件里调用跳转

startActivity(
        FlutterActivity.createDefaultIntent(ACTIVITY)
);

这是默认跳转flutter 的main函数,如果成功了就代表引入成功了,后续再进行其他开发。

二、导入AAR包

1、在模组项目里运行控制台,输入

flutter build aar

会得到以下输出

Consuming the Module
  1. Open <host>\app\build.gradle
  2. Ensure you have the repositories configured, otherwise add them:

      String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
      repositories {
        maven {
            url 'E:\android studio\fluttermix\build\host\outputs\repo'
        }
        maven {
            url "$storageUrl/download.flutter.io"
        }
      }

  3. Make the host app depend on the Flutter module:

    dependencies {
      debugImplementation 'com.example.fluttermix:flutter_debug:1.0'
      profileImplementation 'com.example.fluttermix:flutter_profile:1.0'
      releaseImplementation 'com.example.fluttermix:flutter_release:1.0'
    }


  4. Add the `profile` build type:

    android {
      buildTypes {
        profile {
          initWith debug
        }
      }
    }


这其实是在教我们怎么引用aar

2、在项目级setting.gradle中添加以下代码

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_PROJECT)
    String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
    repositories {
        google()
        mavenCentral()
        maven {
            url 'E:/android studio/fluttermix/build/host/outputs/repo'
        }
        maven {
            url "$storageUrl/download.flutter.io"
        }
    }
}

3、在app级build.gradle中添加以下代码

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    profile {
        initWith debug
    }

}

在dependencies中添加以下代码,注意替换名字

debugImplementation 'com.example.fluttermix:flutter_debug:1.0'
profileImplementation 'com.example.fluttermix:flutter_profile:1.0'
releaseImplementation 'com.example.fluttermix:flutter_release:1.0'

4、最后在AndroidManifest中引用,和导入模组的步骤一样,就不赘述了

总结

虽然文章很短,但是我足足花了两天才运行起来,就是因为某些镜像问题导致的,不论是内网外网都找不到解决办法,后来还是看到了一篇不起眼的博客才解决的。所以大家碰上此类问题一定一定,千万千万要记录下来,省得下次抓瞎。

这两种引入方式各有优劣,以下是官方文档原话:

  1. AAR 集成 AAR 机制可以为每个 Flutter 模块创建 Android AAR 作为依赖媒介。当你的宿主应用程序开发者不想安装 Flutter SDK 时,这是一个很好方案。但是每次修改都需要重新编译。
  2. 模块源码集成 直接将 Flutter 模块的源码作为子项目的依赖机制是一种便捷的一键式构建方案,但此时需要另外安装 Flutter SDK,这是目前 Android Studio IDE 插件使用的机制。

总结一下就是aar适合团队使用,不用每个人都配置flutter,一人开发其他人导入aar后能直接用;而模组形式则要求开发者必须配置flutter sdk,但是胜在编写代码方便,哪里出错了直接打开模组文件改就行。

目前尚不清楚大厂倾向于哪种方式,有了解的朋友可以在评论区说明一下,我也挺想知道的,感谢!

最后的最后,叮嘱刚入门的朋友一句:

强烈建议跟着官方文档走一遍!!!