Flutter踩坑:原生安卓页面向Flutter通信

Flutter踩坑:原生安卓页面向Flutter通信

前言

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

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

前文中我们已经接入并且打开了原生安卓的页面,也就是说主动通信已经完成。

真实的项目中,肯定不可能只有 Flutter 向原生安卓通信,肯定也原生安卓向 Flutter 发送信息。

操作其实很简单,就是将 method channel 的调用,反过来,由原生执行 invokeMethod ,由 Flutter 接收 method

但是这里面有很多坑。

执行

在插件中实例化MethodChannel,并且注册 MethodCallHandler

同时将这个 MethodChannel 放到静态变量中,以便在 Java 页面中调用。

这个我在网上搜了很多方式,都是让实例化 Flutter Engine 或者实例化 plugin 插件,但是实际上都没能成功,估计重新实例化的已经不是当前的这个 Flutter Engine实例或者插件实例了。

// 省略import
public class TestPlugin implements FlutterPlugin, MethodCallHandler,ActivityAware {static public MethodChannel channel;private Activity activity;@Overridepublic void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {TestPlugin.channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "test_plugin");TestPlugin.channel.setMethodCallHandler(this);}static public MethodChannel getChannel(){return TestPlugin.channel;}@Overridepublic void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {System.out.println( "================ 收到方法调用 ==========");System.out.println( call.method);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) {TestPlugin.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;}
}

Java 页面中的调用

TestPlugin.getChannel().invokeMethod("onMessageReceived", "这里是发送的信息");

Flutter 页面中接收到信息

MethodChannel("test_plugin").setMethodCallHandler((call) async {print("接到方法调用: ${call.method}");if (call.method == 'onMessageReceived') {final String message = call.arguments as String;print('========aaa Received message from android: $message');// TODO: 处理接收到的信息}
});

总结

原生向 Flutter 发送信息时,会遇到许多莫名其妙的问题,网上搜了很多方法,但是都无效。

例如安卓原生页面直接继承 FlutterActivity,重新拿到 FlutterEngine实例然后实例化MethodChannel,但是真机调试时报设备不支持GooglePlay服务。

还有直接实例化插件类等等方式都不能成功。

因此我换用了在插件中直接使用静态变量传递已经初始化好的 MethodChannel,果然奏效。

当然,我觉得这个问题应该有更好的解决方案,但是目前没有找到,先使用这个方式解决问题,以作记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/19228.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

w043基于springboot的“衣依”服装销售平台的设计与实现

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件&#xff0…

【计算机网络安全】湖北大学-mysql事务隔离性实验

参考数据库实验:并发控制实验(MySQL)-CSDN博客,大佬写的很好 实验环境 实验需要mysql环境,如果我们本机有mysql客户端,或者安装过phpstudy都可以直接用,Kali似乎也有。 本机启动phpstudy&…

UE5 猎户座漂浮小岛 08 构造脚本

视频教程 90后小陈老师的个人空间-90后小陈老师个人主页-哔哩哔哩视频 1.构造脚本 1.1 简介 类似构造函数代码创建多个效率高 1.2 添加静态网格体 1.3 散乱立方体 使用for循环生产10个立方体 随机位置生成10个散乱的立方体 1.4 整齐立方体 1.5 随机物体 1.6 样条实现曲度墙…

OpenHarmony-2.DeviceInfo适配

DeviceInfo适配说明 1.启动子系统设备信息说明 2.OHOS 2.1.OHOS 固定值参数适配 OHOS 固定值参数: const.ohos.version.security_patch const.ohos.releasetype const.ohos.apiversion const.ohos.fullname适配说明: OHOS 固定值参数由OHOS系统填充&#xff0…

【电机控制】数学——微分

【电机控制】数学——微分 文章目录 [TOC](文章目录) 前言一、导数二、梯度三、▽算子四、散度四、旋度五、积规则a.函数求导1、函数之和求导2、函数与常数求导3、两个函数乘积求导4、一个函数除以一个函数求导 b.矢量函数求导1.构造标量2.构造矢量 c.梯度求导d.散度求导e.旋度…

day04(单片机高级)硬件基础

目录 硬件基础 初级硬件工程师 中级硬件工程师 高级硬件工程师 需要学习的知识点 硬件基础 初级硬件工程师 了解数字电路、模拟电路知识,熟悉常用电子元器件的性能原理; 熟悉PCB设计流程和规范(华为),熟悉Altium Desig…

Nginx 使用入门介绍

大家好,我是G探险者! 今天聊一聊nginx. Nginx 是一款高性能的 Web 服务器、反向代理服务器以及负载均衡器。它因其轻量级、稳定性和高并发处理能力,在全球范围内得到了广泛应用。许多大型网站(如 Netflix、Dropbox 和 WordPress…

停车场空位引导系统

随着城市化进程的加速和汽车保有量的持续增长,传统停车场面临着前所未有的压力。在这些停车场中,停车困难与寻找自己的停车位麻烦复杂已成为许多驾驶者日常出行的一大痛点。 一.传统停车场痛点 在传统停车场中,车位难找,停车场缺…

([LeetCode仓颉解题报告] 661. 图片平滑器

[LeetCode仓颉解题报告] 661. 图片平滑器 一、 题目1. 题目描述2. 原题链接 二、 解题报告1. 思路分析2. 复杂度分析3. 代码实现 三、 本题小结四、 参考链接 一、 题目 1. 题目描述 2. 原题链接 链接: 661. 图片平滑器 二、 解题报告 1. 思路分析 由于只需要3*39个格子&am…

SpringCloud多机部署,负载均衡-LoadBalance

一.负载均衡 1.1问题描述 //根据应用名称获取服务列表 List<ServiceInstance> instancesdiscoveryClient.getInstances("product-service"); //一个微服务可能有多个实例&#xff0c;获取第一个 EurekaServiceInstance instance(EurekaServiceInstance)insta…

基于Java Springboot甘肃旅游管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

软考-信息安全-网络安全体系与网络安全模型

4.1 网络安全体系概述 网络安全保障是一项复杂的系统工程&#xff0c;是安全策略&#xff0c;多种技术&#xff0c;管理方法和人员安全素质的综合。 4.1.1 网络安全体系概念 现代的网络安全问题变化莫测&#xff0c;要保障网络系统的安全&#xff0c;应当把相应的安全策略&a…

CSS基础选择器与div布局

基础选择器一 全局选择器 可以与任何元素匹配&#xff0c;优先级最低&#xff0c;不推荐使用 *{margin: 0;padding: 0;}元素选择器 HTML文档中的元素&#xff0c;p、b、div、a、img、body等。 标签选择器&#xff0c;选择的是页面上所有这种类型的标签&#xff0c;所以经常…

Python毕业设计选题:基于Spark的国漫推荐系统的设计与实现-django+spider

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统登录 管理员功能界面 漫画数据管理 看板界面 系统管理 摘要 系统的设计主要包括…

Linux 链式与层级中断控制器讲解:原理与驱动开发

往期内容 本专栏往期内容&#xff0c;interrtupr子系统&#xff1a; 深入解析Linux内核中断管理&#xff1a;从IRQ描述符到irq domain的设计与实现Linux内核中IRQ Domain的结构、操作及映射机制详解中断描述符irq_desc成员详解Linux 内核中断描述符 (irq_desc) 的初始化与动态分…

“数字化”让党建更“智慧”:帆软塑造党建发展新动能

智慧党建是新时代党的建设的重要创新&#xff0c;它通过互联网、大数据、云计算和人工智能等现代信息技术&#xff0c;实现了党建工作的数字化、智能化。帆软公司的Fine产品线&#xff0c;包括FineDataLink、FineReport、FineVis和FineBI&#xff0c;提供了一个全面的大数据分析…

利用c语言详细介绍下冒泡排序

软件开发过程中&#xff0c;排序算法是常规且使用众多的方法之一&#xff0c;而冒泡算法又是排序算法中最常规且基本的算法。今天我们利用c语言&#xff0c;图文详细介绍下冒泡算法。 一、图文介绍 我们输入一个数组&#xff0c;数组为【10&#xff0c;5&#xff0c;3&#xf…

小程序-基于java+SpringBoot+Vue的实习生管理系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

全新升级抗性宏基因组,直击病毒和毒力因子分析!

基于宏基因组测序的抗性基因分析是目前抗性基因分析的重要手段。为了协助研究工作者对抗性基因开展更深入且全面的探研&#xff0c;凌恩生物技术团队致力于技术研发&#xff0c;推出了全新升级版的宏基因组抗性基因分析流程。此流程采用五大数据库进行详尽的注释分析&#xff0…

算法--“汽车加油”问题.

def greedy():n 100 # 汽车满油后可行驶的最大距离d [50, 80, 39, 60, 40, 32] # 加油站的距离k len(d) # 加油站的数量# 检查是否有加油站距离超过汽车的最大行驶距离for dist in d:if dist > n:print(no solution)returnnum 0 # 加油次数current_position 0 # 当…