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日

相关文章

  • asp.net Javascript获取CheckBoxList的value

    下面我将详细讲解如何使用 JavaScript 在 ASP.NET 中获取 CheckBoxList 的值。 1. 获取 CheckBoxList 中选中项的值 要想获取 CheckBoxList 中选中项的值,可以通过以下的方式实现: // 获取 CheckBoxList 的实例 var cbList = document.getElementById(‘…

    JavaScript 2023年6月10日
    00
  • 深入理解React Native核心原理(React Native的桥接(Bridge)

    深入理解React Native核心原理之桥接(Bridge) React Native是一种基于React的JS框架,它可以让你使用JavaScript和React的开发方式来构建iOS和Android的原生应用。这些原生应用实际上是通过React Native桥接(Bridge)在JavaScript和iOS/Android平台之间进行通信和交互的。 什…

    JavaScript 2023年6月11日
    00
  • Python使用Asyncio进行web编程方法详解

    Python使用Asyncio进行Web编程方法详解 概述 Asyncio是Python 3中内置的异步编程框架,它允许开发者使用协程方式来进行异步编程,以此提供高效的I/O操作和并发处理。在Web编程中,Asyncio也被广泛应用。本篇文章将详细介绍如何使用Asyncio进行Web编程。 使用Asyncio进行Web编程的基本步骤 1. 安装必要的依赖 在…

    JavaScript 2023年5月28日
    00
  • javascript中创建对象的几种方法总结

    JavaScript中创建对象的几种方法总结 JavaScript中创建对象的方式有多种,下面将详细介绍Javascript中创建对象的几种方法,以及它们的使用场景。 1. 使用对象字面量 使用对象字面量方式可以创建一个新的对象,这是一种最简单和常用的方式。对象字面量是由一对花括号({})包含着一个无序的键值对(key:value)列表,其中键名是字符串,值…

    JavaScript 2023年5月27日
    00
  • Bootstrap 表单验证formValidation 实现表单动态验证功能

    下面将详细讲解 Bootstrap 表单验证 formValidation 实现表单动态验证功能的完整攻略。 什么是 Bootstrap 表单验证 formValidation Bootstrap表单验证formValidation是一种基于jQuery的验证表单的插件。它是一个简单易用、灵活性强的工具,可以帮助开发者实现表单的动态验证功能。 formVal…

    JavaScript 2023年6月10日
    00
  • JS中数组Array的用法示例介绍

    下面是JS中数组Array的用法示例介绍的完整攻略。 数组定义与初始化 数组定义了一系列变量,可以通过一个变量名获取其中任意一个变量的值。在 JavaScript 中,可以使用以下方式来定义和初始化一个数组: let array = [1, 2, 3, 4, 5]; // 数组里有5个数字 let emptyArray = []; // 定义空数组 数组的基…

    JavaScript 2023年5月27日
    00
  • 关于vue 结合原生js 解决echarts resize问题

    关于vue结合原生js解决echarts resize问题,可以使用下面的攻略: 攻略说明 采用vue-echarts插件加载echarts,并且绑定图表的 DOM 元素到 vue 实例中 使用 js 的 resize() 方法,监听 window 大小变化,当窗口大小发生改变时,使用 triggerResize() 方法通知echarts自适应大小 示例说…

    JavaScript 2023年6月11日
    00
  • JavaScript字符串包含问题

    JavaScript字符串包含问题是指在一个字符串中,查找是否包含另一个字符串的问题。通常使用indexOf()或includes()方法来解决该问题。 使用indexOf()方法 indexOf()方法返回字符串中指定字符或字符串第一次出现的位置。返回值为-1表示未找到。可以通过以下方式使用它来判断一个字符串是否包含另一个字符串: let str = ‘h…

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