Android 原生项目集成 Flutter

主题 [Flutter](()

了解一下如何在 Android 原生项目中集成 Flutter

[](()具体操作


[](()生成配置

在原生项目根目录执行命令

flutter create -t module --org {package_name} {module_name}

// 此处 module_name 的命令遵循 Android 子 module 的命名即可。不能有中划线。

// 比如,

flutter create -t module --org com.engineer.mini.flutter flutter_sub

结果

Creating project sub_flutter…

sub_flutter/test/widget_test.dart (created)

sub_flutter/sub_flutter.iml (created)

sub_flutter/.gitignore (created)

sub_flutter/.metadata (created)

sub_flutter/pubspec.yaml (created)

sub_flutter/README.md (created)

sub_flutter/lib/main.dart (created)

sub_flutter/sub_flutter_android.iml (created)

sub_flutter/.idea/libraries/Dart_SDK.xml (created)

sub_flutter/.idea/modules.xml (created)

sub_flutter/.idea/workspace.xml (created)

Running “flutter pub get” in sub_flutter… 1,054ms

Wrote 11 files.

最终生成了以上文件,注意这里最后 自动执行了 flutter pub get 的命令。关于 flutter pub get 具体做了什么,可以参考后面的。

[](()这里在项目根目录创建子 module 只是为了把代码放在一个仓库,方便维护,理论上可以放在硬盘的任何位置。

[](()配置原生项目 settings.gradle

在配置 settings.gradle 之前先来简单回顾一下关于 Gradle 的一些基础知识。

如果你了解过 Gradle 相关的配置的话,一定会看到一个概念,就是 约定优于配置 ,什么意思呢,按照面向对象的思路来理解,每一个工程是一个巨大的 Project 类,整个类里有很多的属性。而我们创建的每一个项目其实就是一个具体的 Project 对象(也就是实例).约定优于配置的意思,就是在 project 实例化的时候,其内部的属性已经有了默认值。那么我们怎么知道有哪些默认值呢?在项目根目录执行

./gradlew properties

就可以得到整个 Project 的一些默认配置,比如(此处节选部分结果)


Root project


allprojects: [root project ‘MiniApp’, project ‘:app’, project ‘:thirdlib’]

android.agp.version.check.performed: true

android.enableJetifier: true

android.enableR8: true

android.enableR8.libraries: true

android.useAndroidX: true

buildDir: /Users/username/Documents/mygithub/MinApp/build

buildFile: /Users/username/Documents/mygithub/MinApp/build.gradle

projectDir: /Users/username/Documents/mygithub/MinApp

rootDir: /Users/username/Documents/mygithub/MinApp

rootProject: root project ‘MiniApp’

这里当前有一些是我们配置的,比如 useAndroidX,但也有一些是约定的,比如 对于整个 project 来说 buildDir 就是项目根目录的 build 文件夹等。

执行

./gradlew :app:properties

节选部分结果

buildDir: /Users/username/Documents/mygithub/MinApp/app/build

buildFile: /Users/username/Documents/mygithub/MinApp/app/build.gradle

就会得到关于 app 整个 module 现阶段的一些配置信息,当然这些配置信息除了约定的,还有你自己配置的,比如 buildToolsVersion ,签名等相关信息。可以看到 buildDir 和整个 project 的是不一样的。

回到主题, 看看如何把我们刚才创建 《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 的 sub_flutter 模块集成到项目中。(严格来说并不是集成 sub_flutter 模块,因为他只是一个 flutter 的模块,而在 Android 主项目只能集成子 Android module,那么具体改怎么做呢,下面就来看看其中的奥秘)

按照官方的操作方法,会要求我们添加以下配置到 settings.gradle 中。

// 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter 是一个跨平台的移动应用开发框架,它可以让开发者使用一套代码同时开发 iOS 和 Android 应用。而在某些情况下,我们可能需要集成原生 SDK 实现一些功能。本文将介绍如何在 Flutter集成原生 SDK。 首先,我们需要在 Flutter 中创建一个平台通道(Platform Channel)来实现 Flutter原生代码的通信。 1.创建一个平台通道 在 Flutter 中,平台通道定义了 Dart 代码和原生代码之间的通信方式。我们可以通过 MethodChannel、EventChannel 或 BasicMessageChannel 等方式来创建平台通道。 以 MethodChannel 为例,我们可以在 Flutter 中创建一个 MethodChannel: ``` final MethodChannel platformChannel = MethodChannel('com.example.platform_channel'); ``` 这里的 com.example.platform_channel 是一个字符串,用来标识 Flutter原生代码之间的通道。 2.在原生代码中实现方法 在原生代码中,我们需要实现与 Flutter 中定义的 MethodChannel 对应的方法。例如,我们可以在 Android 中创建一个名为 MyPlugin 的类来实现这个方法: ``` public class MyPlugin implements MethodCallHandler { private static final String CHANNEL = "com.example.platform_channel"; public static void registerWith(Registrar registrar) { final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL); channel.setMethodCallHandler(new MyPlugin()); } @Override public void onMethodCall(MethodCall call, Result result) { if (call.method.equals("getDeviceInfo")) { String deviceInfo = getDeviceInfo(); result.success(deviceInfo); } else { result.notImplemented(); } } private String getDeviceInfo() { // 获取设备信息的代码 return "device info"; } } ``` 这里的 getDeviceInfo 方法用来获取设备信息,并将结果返回给 Flutter。 3.在 Flutter 中调用方法 在 Flutter 中,我们可以通过 MethodChannel 来调用 MyPlugin 中实现的方法: ``` String deviceInfo = await platformChannel.invokeMethod('getDeviceInfo'); ``` 这里的 invokeMethod 方法用来调用 getDeviceInfo 方法,并将结果返回给 Flutter。 以上就是在 Flutter集成原生 SDK 的基本流程。在实际使用中,我们还需要注意一些细节,例如方法参数和返回值的类型转换等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值