Flutter 混合开发 (交互通信)

上篇我们介绍了 Flutter 模块集成到已有的项目工程,接下来我们看看 Native 跟 Flutter 间的交互问题。

交互通信

Flutter 与原生之间的通信依赖灵活的消息传递方式:

1,Flutter 部分通过平台通道将消息发送到其应用程序的所在的宿主环境(原生应用)。

2,宿主环境通过监听平台通道,接收消息。然后它会调用平台的 API,响应 Flutter 发送的消息。

Flutter主动 调用 宿主环境

在 Flutter 中通过 MethodChannel 的 API 可以发送与方法相对于的消息,宿主环境 iOS 中通过 FlutterMethodChannel 接受方法的调用并返回结果。

Flutter 需要引入 services.dart 模块才可以使用 MethodChannel

1
import 'package:flutter/services.dart';

Flutter 中的调用代码

1
const methodChannel = const MethodChannel("com.pages.flutter/call_native");
1234567891011121314151617181920
RaisedButton(        child: Text("call_native_method_no_params"),        onPressed: (){      		   methodChannel.invokeMethod("call_native_method_no_params",null);        },      ),      RaisedButton(        child: Text("call_native_method_params"),        onPressed: (){          Map<String,String> params = {"params":"flutter params"};          methodChannel.invokeMethod("call_native_method_params",params);        },      ),      RaisedButton(        child: Text("call_native_method_native_result_callback"),        onPressed: (){          _nativeCallbackWithParams();        },      ),      Text(_content,style: TextStyle(color: Colors.red),)
123456789101112
Future<Null> _nativeCallbackWithParams() async{  dynamic result;  try {      result = await methodChannel.invokeMethod(            "call_native_method_native_result_callback", null);  } on PlatformException catch (e) {    result = "Failed to get params: '${e.message}'.";  }  setState(() {    _content = result;  });}

iOS 中的调用代码

1234567891011121314
FlutterViewController* flutterViewController = [[FlutterViewController alloc] init];flutterViewController.fd_prefersNavigationBarHidden = YES;FlutterMethodChannel * messageChannel = [FlutterMethodChannel methodChannelWithName:@"com.pages.flutter/call_native" binaryMessenger:flutterViewController];[messageChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult  _Nonnull result) {        NSLog(@"flutter call native:n method=%@ n arguments = %@",call.method,call.arguments);        if ([call.method isEqualToString:@"call_native_method_native_result_callback"]) {            if (result) {                result(@"flutter hello");            } 大专栏  Flutter 混合开发 (交互通信)        }else if([call.method isEqualToString:@"call_native_method_pop_flutter_nav"]){            [weakSelf.navigationController popViewControllerAnimated:YES];        }    }];[self.navigationController pushViewController:flutterViewController animated:YES];

分别看下控制台输出:

123
flutter call native:method=call_native_method_no_params arguments = (null)
12345
flutter call native:method=call_native_method_params arguments = {  params = "flutter params";}

第三个事件会在 Flutter 页面显示flutter hello 该值由宿主环境返回。

注意: 这里有个设计上的细节,上节提到过就是导航栏的问题,因为宿主环境有个导航栏,而 Flutter 自身也有导航栏,出现了矛盾,到底我们应该保留宿主环境的,还是 Flutter 页面使用自身,隐藏宿主环境的导航栏。我个人觉得后则更合理,Flutter 页面更了解自己导航栏具体功能、主题、交互及显示,我们只需要处理点击返回按钮 pop 回到宿主环境中,如下:

1234
appBar: AppBar(      title: Text('Flutter Page') ,      leading: IconButton(icon: Icon(Icons.arrow_back_ios), onPressed:()=>methodChannel.invokeMethod("call_native_method_pop_flutter_nav",null)),    ),

我们只需要在宿主环境中监听到该事件后调用导航的 pop 功能。

宿主环境主动调用 Flutter

一般可以用作宿主环境为 Flutter 提供参数

EventChannel 是 Flutter 监听宿主环境的 API ,FlutterEventChannel 是 iOS 宿主环境与 Flutter 交互平台通道的 API 。

Flutter 代码片段

1
const EventChannel eventChannel = const EventChannel('com.pages.flutter/call_flutter');
1234567891011121314151617
void initState(){  super.initState(); eventChannel.receiveBroadcastStream(12345).listen(_onEvent,onError: _onError);}

void _onEvent(Object event){  setState(() {    _content = event.toString();  });}

void _onError(Object error){  setState(() {    _content = error.toString();  });}

iOS 宿主环境代码片段

123
NSString *eventChannelName = @"com.pages.flutter/call_flutter";FlutterEventChannel *eventChannel = [FlutterEventChannel eventChannelWithName:eventChannelName binaryMessenger:flutterViewController];[eventChannel setStreamHandler:self];
12345678910
- (FlutterError *)onListenWithArguments:(id)arguments eventSink:(FlutterEventSink)events {    if (events) {        events(@"hi flutter");    }    return nil;}

- (FlutterError* _Nullable)onCancelWithArguments:(id _Nullable)arguments {    return nil;}

两端交互通信方式就是这样的,这里也只是介绍了他们通信的方式,具体如何优雅的封装、规范交互流程还需要我们自己去考虑下。

原文地址:https://www.cnblogs.com/liuzhongrong/p/12288934.html

时间: 2024-12-29 23:25:51

Flutter 混合开发 (交互通信)的相关文章

Flutter基础系列之混合开发(二)

1.混合开发的场景 1.1作为独立页面加入 这是以页面级作为独立的模块加入,而不是页面的某个元素. 原生页面可以打开Flutter页面 Flutter页面可以打开原生页面 1.2作为页面的一部分嵌入 比如说原生页面中只有某一个item是Flutter: Flutter页面中只有某一部分是原生视图 2.Flutter混合开发的集成步骤 2.1创建Flutter Module 在做混合开发之前,我们首先需要创建一个Flutter Module. 这里建议Flutter Module的创建目录和原生工

不得不看的Flutter与Android混合开发

记得在flutter刚出来时,笔者就开始学习flutter.但由于当时嫌弃flutter复杂的层级组合且未推出稳定版,所以当时就放弃了深入学习,现如今随着flutter的蓬勃发展及大佬们的力推,就又入坑flutter.虽说flutter能够跨平台,但由于现在几乎都是现成的项目,所以不可能用flutter来重头开发,所以目前几乎都是采用native+flutter的混合开发方案.那么该方案该如何实现尼?1.flutter模块的导入首先,切换到native项目的根目录的上一级目录.以笔者项目为例,路

浅谈混合开发与Android,JS数据交互

本文是作者原创,如转载请注明出处! 一.概论 现在时代已经走过了移动互联网的超级火爆阶段,市场上移动开发人员已经趋于饱和,显然,只会原生APP的开发已不能满足市场的需求,随着H5的兴起与火爆,H5在原生APP中的使用越来越广泛,也就是我们常说的混合开发(Hybrid APP).最新很火的微信小程序相信大家都是知道的,实际上微信小程序加载的界面就是一个HTML5的界面,HTML5界面在一些电商类的APP中主要承担展示数据的作用,但是他的作用并不仅限于此,最起码js调用原生方法和原生调用js的方法是

关于混合开发,oc与js互相通信的方法总结:

最近做公司的几个项目,主要以为h5为主,不能实现的功能用oc来写,这样就经常牵扯到oc调用js,或者js调用oc.先插嘴一句,对于目前而言,我对H5包装下的app的用户体验是极其的不满,真的没法和原生比较.对注重用户体验的公司还是比较倾向与混合开发. 根据个人长期摸索,和开发踩过的坑,在这稍微总结一下下..网上有的基本都很零散,对于开发在使用还需要具体根据项目情况来使用. oc与js互相调用目前我知道的时主要有4种直接的方式: 1. 苹果的javascriptcore.framework框架;

Hybrid小程序混合开发之路 - 数据交互

HTML+CSS是历史悠久.超高自由度.控制精准.表现能力极强.编码简单.学习门槛超低.真跨平台的一种UI界面开发方式. 本文介绍的是微信小程序和H5混合开发的一种数据交互方式. 很多应用在原生界面中混杂着HTML界面 记得xp时代的QQ,有些界面偶尔会弹出熟悉的js错误对话框,还能右键弹出熟悉的IE6的右键菜单,伪装的挺好,差点没认出来,现在的QQ就不知道了. 美团.淘宝这些拥有几乎无限界面的手机App,顶部进度条一亮,这是一个H5 没谁了! Electron!好嗨哟~ 数据交互 使用了HTM

混合开发

1.混合开发概述 Hybrid App主要以JS+Native两者相互调用为主,从开发层面实现"一次开发,多处运行"的机制,成为真正适合跨平台的开发.Hybrid App兼具了Native App良好用户体验的优势,也兼具了Web App使用HTML5跨平台开发低成本的优势. 目前已经有众多Hybrid App开发成功应用,比如美团.爱奇艺.微信等知名移动应用,都是采用Hybrid App开发模式. 2.移动应用开发的三种方式比较 移动应用开发的方式,目前主要有三种: Native A

AppCan赵庆华: Hybrid 混合开发正当时

巨大的市场对于App开发服务提供商来说是绝佳的机遇.AppCan作为国内混合开发的领导品牌,同时服务开发者B2D和企业级B2B市场,提供移动应用开发平台和企业移动整体解决方案.多年来,AppCan一直把降低APP开发的技术门槛.降低企业的移动化成本作为研发目标,致力打造一体化.一站式移动平台,让移动化进程不再受限于技术. 近日,51CTO记者采访了AppCan CTO赵庆华,他为我们介绍了AppCan如何利用Hybrid混合开发帮助企业移动化. 移动开发两大趋势:原生VS混合 移动化浪潮来临,传

Hybrid APP混合开发的一些经验和总结

Hybrid APP混合开发的一些经验和总结 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经验和总结,欢迎各位一起交流学习~ 1.混合开发概述 Hybrid App主要以JS+Native两者相互调用为主,从开发层面实现“一次开发,多处运行”的机制,成为真正适合跨平台的开发.Hybrid App兼具了Native App良好用户体验的优势,也兼具了Web App使用HTML5跨平台开发低成本的优势. 目前已经有众多Hybrid App开

浅谈UIWebView,HTML5与Native的混合开发

今天在做项目的时候,遇到了UIWebView的问题,所以今天顺便总结一下,同时也简单的谈了一下Native与H5的混合开发,关于混合开发这块,研究的不算太好,希望广大博友指正~~ 网络开发中,当公司已经使用 HTML5 技术实现同时适应 Android 和 iOS 等多个平台的网页时,这时往往需要我们 iOS 平台能够嵌入网页并进行各种交互, 这里我们考虑的方案就是:使用 UIWebView 网页控件 UIWebView是苹果给我们提供展示网页的一种控件. UIWebView的基本用法 我们一般