Flutter开发者进阶:接入安卓原生页面

embedded/2024/11/20 7:26:06/

Flutter开发者进阶:接入安卓原生页面

前言

Flutter APP 的开发过程中,有时不仅需要使用 Flutter 提供的组件,还需要使用原生的组件。

例如在对接外部 SDK 时,如果自己重新实现 SDK 的逻辑,无疑是本末倒置。

在这种情况下有两种方式可以使用:

  1. Flutter 项目转为 Flutter Module,打包为 aar ,在原生项目中引用,使用原生的方式调用 Flutter,这无疑增加了很多原生开发的工作。

  2. SDK 引入到 Flutter 中,作为一个 Flutter Plugin,建立方法通道(method channel),调用原生的方法或者页面。

本篇文章将讨论第二种方法。

将一个带有页面的原生安卓 SDK 接入 Flutter 中使用。

话不多说,直接开始。

创建Flutter Plugin

在Flutter项目的根目录执行:

flutter create --template=plugin --platforms=android my_flutter_plugin

这个会创建一个插件工程,里面已经配置好了 Flutter Plugin 的基本结构,包括 build.gradle 文件, AndroidManifest.xml 文件, pubspec.yaml 文件等。

插件工程大致的目录结构如下:

my_flutter_plugin|- android|  |- src|  |  |- main|  |  |  |- java|  |  |  |  |- com|  |  |  |  |  |- example|  |  |  |  |  |- my_flutter_plugin|  |  |  |  |  |  |- MyFlutterPlugin.java|  |  |  |  |- AndroidManifest.xml|  |  |  |- res|  |  |  |  |- values|  |  |  |  |  |- strings.xml|  |  |  |  |- layout|  |  |  |  |  |- main.xml|  |  |  |  |- mipmap|  |  |  |- build.gradle

迁入SDK

将SDK的代码文件迁入到android/src/main/java/com/example/my_flutter_plugin目录下。

包括包内的代码,注意修改包名。

融合 build.gradle 文件,尤其是 dependencies 部分。

修改 AndroidManifest.xml,清除其中的权限部分,写入到 Flutter 生成的 Android 部分里面去

将要使用的页面 Activity 注册到这里。

修改插件代码

修改MyFlutterPlugin.java文件,如下示例:

// 省略 import // 注意这个 ActivityAware ,这是调起页面的关键,否则拿不到上下文
public class MyFlutterPlugin implements FlutterPlugin, MethodCallHandler,ActivityAware{private static final String TAG = "MyFlutterPlugin";private MethodChannel channel;private Activity activity;@Overridepublic void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), Tag);channel.setMethodCallHandler(this);}@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {if (call.method.equals("openNativePage")) {if (activity != null) {Intent intent = new Intent(activity, MainActivity.class);activity.startActivity(intent);result.success("Native page opened");} else {result.error("ACTIVITY_NOT_AVAILABLE", "Activity is not available", null);}} else {result.notImplemented();}}@Overridepublic void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) {channel.setMethodCallHandler(null);}@Overridepublic void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {activity = binding.getActivity();}@Overridepublic void onDetachedFromActivityForConfigChanges() {activity = null;}@Overridepublic void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) {activity = binding.getActivity();}@Overridepublic void onDetachedFromActivity() {activity = null;}
}

注册插件

Flutter 项目的 pubspec.yaml 文件中,添加如下代码:

dependencies:flutter:sdk: fluttermy_flutter_plugin: path: ./my_flutter_plugin

重新安装依赖

flutter clean
flutter pub get

在 Flutter 中调用

 await MethodChannel("MyFlutterPlugin").invokeMethod("openNativePage");

运行 Flutter

flutter run 

现在你可以在你的 Flutter 项目中看到原生页面的调起

总结

Flutter 接入原生页面,主要通过 Flutter Plugin 的方式,通过 MethodChannel 调用原生的页面。

一般按照步骤都会调用成功,但是不排除一些特殊的情况

例如:

其它插件对 SDK 版本的要求不一致,导致启动失败,根据报错修改 SDK 版本即可。

一直报错

Unhandled Exception: MissingPluginException(No implementation found for method getPlatformVersion on channel xxx)

这个一般是通道名称不一致,或者调用页面时没有实现ActivityAware接口,导致上下文为空。


http://www.ppmy.cn/embedded/139006.html

相关文章

多邻国网页版怎么登录?

我之前一直用APP,最近才发现还有多邻国网页版,感觉网页版的多邻国使用感觉比APP舒服好多,而且很多功能只有网页版才有,多邻国网页版登录其实很简单,直接在官网www.duolingo.cn登录就可以。 一、多邻国是什么&#xff1…

Java项目实战II基于微信小程序的私家车位共享系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在城市化进…

算法——环形链表(leetcode141)

判断一个链表是否是环形链表,这题可以用快慢指针来解决,首先令快慢指针fastIndex、slowIndex等于head头节点,接着来一个循环 循环体是fastIndex步进两个单位slowIndex步进一个单位判断如果slowIndex等于fastIndex则是有环 因为fastIndex走的比slowIndex快…

华为VPN技术

1.启动设备 2.配置IP地址 [FW1]int g1/0/0 [FW1-GigabitEthernet1/0/0]ip add 192.168.1.254 24 [FW1-GigabitEthernet1/0/0]int g1/0/1 [FW1-GigabitEthernet1/0/1]ip add 100.1.1.1 24 [FW1-GigabitEthernet1/0/1]service-manage ping permit [FW2]int g1/0/0 [FW2-Gi…

MFC线程

一 、AfxBeginThread AfxBeginThread 是 MFC(Microsoft Foundation Classes,微软基础类库)中用于创建一个新线程的函数。它返回一个指向 CWinThread 类对象的指针,通过这个指针可以对创建出来的线程进行后续的操作和控制。 CWinT…

k-近邻算法(K-Nearest Neighbors, KNN)详解:机器学习中的经典算法

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

23、论文阅读:基于多分辨率特征学习的层次注意力聚合GAN水下图像增强

Hierarchical attention aggregation with multi-resolution feature learning for GAN-based underwater image enhancement 引言介绍相关工作2.1 传统方法2.1.1 图像增强方法2.1.2 图像复原方法 基于深度学习的方法基于卷积神经网络(CNN)的方法基于生成…

Cloud Native 云原生后端的开发注意事项

在云原生后端开发里,数据管理和存储这块得好好弄。数据库选型得综合考虑,像关系型数据有复杂查询需求就选 MySQL、PostgreSQL,海量非结构化数据就可以考虑 MongoDB、Cassandra 这些。设计数据库得遵循规范化原则,像设计电商订单表…