Flutter web bridge 通信总结分析详解

Flutter web bridge 通信总结分析详解

本文将详细讲解Flutter Web中的Bridge通信机制。Flutter Web框架中,开发者可以使用Bridge来实现Flutter与Web端的通信交互。Bridge通信机制主要包含以下三个部分:Method Channel、Event Channel、Basic Message Channel。

Method Channel

Method channel是Flutter与Web之间实现双向通信的基本手段,通过Method channel,我们可以在Flutter和JS之间交互调用。Method Channel的实质是一个注册机制,Flutter和Web通过Method Channel映射一对方法,Flutter在调用其注册的方法时,会传递参数过去,同时阻塞当前线程直到JS处理完毕返回结果。示例代码如下:

Flutter端代码:

import 'package:flutter/services.dart';

// 声明MethodChannel
const MethodChannel _channel = MethodChannel('web_channel');

// 调用Web端方法
Future<String> callWebApi() async {
  final results = await _channel.invokeMethod<String>('helloFromWeb', {'name': 'Flutter'});
  return results;
}

Web端代码:

const {MethodChannel} = require('flutter_web_plugins');

// 注册方法
MethodChannel.setMethodCallHandler((call) => {
  if (call.method === 'helloFromWeb') {
  const name = call.arguments.name;
    return Promise.resolve(`Hello ${name} from Web`);
  }
});

Flutter调用Web端方法时,MethodChannel.invokeMethod函数会阻塞,直到Web端方法返回结果。Web端处理完Flutter传递的参数后,可以通过Promise返回结果。注意,Method Channel支持的参数类型和返回值类型必须是StandardMessageCodec能够序列化的数据类型。

Event Channel

Event Channel可以用来建立Flutter与JS之间的事件通信。Event Channel将Flutter和Web的消息传递火车换成了UA风格的事件机制,Flutter和Web通过Event Channel建立起一个“桥”,Flutter可以向这个桥发布事件,并且监听Web发布的事件。

Flutter端代码:

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

// 声明EventChannel
const EventChannel _channel = EventChannel('web_events');

// 订阅事件
StreamSubscription<dynamic> _subscription;

@override
void initState() {
  super.initState();
  _subscription = _channel.receiveBroadcastStream().listen(_handler, onError: _errorHandler);
}

// 事件处理器
void _handler(event) {
  print('Received event: $event');
}

void _errorHandler(error) {
  print('Received error: $error');
}

@override
void dispose() {
  super.dispose();
  _subscription.cancel();
}

Web端代码:

const {EventChannel} = require('flutter_web_plugins');

// 声明Event Channel
const eventChannel = new EventChannel('web_events');

// 发送事件
eventChannel.emit('message', 'Hello World!');

Flutter端通过Event Channel建立了一个监听器,当Web端触发事件后,Flutter即可获取到对应的事件。注意,Event Channel只能传递基本数据类型,如果需要传递自定义数据类型可以将其转化为JSON字符串进行传递。

Basic Message Channel

Basic Message Channel会自动序列化传递数据,但只支持传输字符串或者字节数组。在实际应用中,我们常常需要传输自定义对象,此时可以使用JSON编码传输。以下是一个将JSON字符串传输给Web并返回处理结果的例子。

Flutter端代码:

import 'dart:async';
import 'dart:convert';
import 'package:flutter/services.dart';

// 声明MessageChannel
const BasicMessageChannel<String> _channel = BasicMessageChannel<String>('web_channel', StringCodec());

// 调用Web端方法
Future<String> callWebApi() async {
  final results = await _channel.send(jsonEncode({'name': 'Flutter'}));
  return results;
}

Web端代码:

const {BasicMessageChannel, StringCodec} = require('flutter_web_plugins');

// 声明Basic Message Channel
const channel = new BasicMessageChannel('web_channel', new StringCodec());

// 监听Flutter端消息
channel.setMessageHandler((message) => {
  const name = JSON.parse(message).name;
  return Promise.resolve(`Hello ${name} from Web`);
});

Flutter端发送一个json编码的Map给Web端,Web端收到后通过JSON解析得到Flutter传递的参数,处理完毕后返回结果。Basic Message Channel支持基本数据类型以及可以通过StandardMessageCodec序列化的数据类型。如果需要传递自定义数据类型,可以将其转化为JSON字符串进行传递。

以上是三种在Flutter Web中实现Flutter与Web端通信的方式。开发时应根据需求选择合适的通信方式进行数据交互。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Flutter web bridge 通信总结分析详解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • ES6数组的扩展详解

    ES6数组的扩展详解 在ES6中,数组的概念得到了进一步扩展和完善,提供了一些新的方法和语法糖,使得开发人员在对数组进行操作时具有更多的便利性。 扩展运算符 在ES6中,一个新的运算符…被引入,称为扩展运算符(spread operator)。扩展运算符可以将数组展开为一系列的参数,方便我们对多个参数进行操作。 示例1:合并数组 const arr1 =…

    JavaScript 2023年5月27日
    00
  • JS实现十分钟倒计时代码实例

    下面是详细讲解“JS实现十分钟倒计时代码实例”的完整攻略。 一、需求分析 首先,我们需要明确需求:实现一个倒计时功能,从10分钟开始倒计时,并在倒计时结束时触发一段特定的操作。 二、技术选型 接下来,我们需要选型。考虑到要实现一个网页上的倒计时,我们选用JavaScript作为主要开发语言,并采用HTML和CSS作为配套技术。 三、代码实现 首先,在HTML…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript之Array.reduce源码解读

    详解JavaScript之Array.reduce源码解读 简介 Array.reduce() 是 Javascript 中一个十分有用的函数,它可以将数组转化为单个值。它的使用方式是这样的 array.reduce(callback[, initialValue]) ,其中 callback 是回调函数,initialValue是初始值。在本文中,我们将通…

    JavaScript 2023年5月27日
    00
  • DOM Scripting中的图片切换[兼容Firefox]

    首先我们来分析一下“DOM Scripting中的图片切换[兼容Firefox]”这个问题。 问题分析 图片切换是一个常见的网页特效,实现该特效的核心是将多个图片进行显示与隐藏。DOM Scripting提供了一种在浏览器中对文档对象模型进行操作的方式,可以利用它来实现图片的切换效果。但是,在不同的浏览器中,对于DOM的实现方式不同,需要针对不同的浏览器,进…

    JavaScript 2023年6月10日
    00
  • javascript的函数劫持浅析

    JavaScript的函数劫持指的是通过改变函数的执行环境,来获得对函数执行结果的控制。这个技术通常使用在针对其他人编写的代码,来改变目标代码的行为。下面是对JavaScript函数劫持的完整攻略: 什么是函数劫持? 函数劫持是指改变JavaScript函数的行为,使其执行方式符合我们的意愿。攻击者能够通过利用函数劫持的技术,在运行时改变目标函数的功能和输出…

    JavaScript 2023年5月27日
    00
  • 学习AngularJs:Directive指令用法(完整版)

    学习AngularJs:Directive指令用法(完整版)是一篇关于AngularJS指令用法的详细攻略。下面我来详细讲解该攻略。 概述 该攻略主要介绍AngularJS中Directive指令的用法,指令是AngularJS的核心部分,它们允许我们扩展HTML,使其具有复杂的行为和交互特性。指令可以用于添加自定义标记,创建自定义元素,设置元素样式,添加事…

    JavaScript 2023年6月10日
    00
  • js left,right,mid函数

    JS中并没有原生提供left,right和mid函数,但我们可以通过JS的字符串方法来模拟实现这些功能。 left函数 left函数用来返回字符串的前n个字符,我们可以使用如下代码实现: function left(str, n) { if (n <= 0) { return ""; } else if (n > str.le…

    JavaScript 2023年5月27日
    00
  • JS button按钮实现submit按钮提交效果

    下面是详细讲解“JS button按钮实现submit按钮提交效果”的完整攻略。 1. 实现步骤 1.1 编写HTML代码 首先,我们需要在HTML中创建一个表单,里面包含需要提交的数据。通过<form>标签来创建表单,<input>标签用于创建输入框、单选框、多选框等表单控件。 <form> <label>U…

    JavaScript 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部