Flutter web bridge 通信总结分析详解

yizhihongxing

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日

相关文章

  • 如何判断元素是否为HTMLElement元素

    如果要判断一个元素是否为 HTMLElement 元素,我们可以使用 JavaScript 自带的 instanceof 方法。 示例 1:使用 instanceof 方法判断元素是否为 HTMLElement 元素 // 获取 HTML 元素 const el = document.querySelector(‘div’); // 判断元素是否为 HTML…

    JavaScript 2023年6月10日
    00
  • JS数组及对象遍历方法代码汇总

    JS数组及对象遍历方法代码汇总 在 JavaScript 开发中,我们经常需要对数组和对象进行遍历操作。为了方便我们的开发,JavaScript 提供了许多遍历方法。本篇文章将为大家介绍常用的 JS 数组及对象遍历方法,并给出相应的示例说明。 数组遍历方法 1. for 循环遍历数组 for 循环是比较传统且常用的数组遍历方法。它可以遍历数组的所有元素,并且…

    JavaScript 2023年5月27日
    00
  • JS实现简单的操作杆旋转示例详解

    下面我将详细讲解“JS实现简单的操作杆旋转示例”的完整攻略。 简介 “JS实现简单的操作杆旋转示例”是一篇介绍如何用JavaScript实现操作杆旋转效果的文章。该文章主要介绍了操作杆旋转的原理以及如何使用JavaScript实现旋转效果的具体步骤。 实现原理 操作杆旋转效果的原理很简单:通过改变操作杆的位置和旋转角度,来模拟操作杆的旋转过程。具体实现过程包…

    JavaScript 2023年6月10日
    00
  • Javascript中的作用域及块级作用域

    一、作用域 在Javascript中,作用域是指访问变量、函数的代码的范围。根据变量的定义位置,作用域可以分为全局作用域、局部作用域。 1.全局作用域 全局作用域是指在代码内部的任何地方都可以访问到的变量。我们可以在任何地方访问和修改全局作用域的变量,这种方式对变量的维护管理不利,并且容易引起变量名冲突。 示例代码: var name = "Tom…

    JavaScript 2023年5月27日
    00
  • JavaScript中setMonth()方法的使用详解

    下面是关于“JavaScript中setMonth()方法的使用详解”的完整攻略。 什么是setMonth()方法? setMonth()方法是JavaScript中Date对象原型上的一个方法,用于设置Date对象的月份。它的用法如下: dateObj.setMonth(month[, date]); 其中,month是一个0到11的整数,对应1月到12月…

    JavaScript 2023年6月10日
    00
  • 浅谈Javascript编程风格

    浅谈Javascript编程风格 Javascript编程风格对于代码的可读性和可维护性具有至关重要的影响。本篇文章将介绍一些遵循良好Javascript编程规范的方法和技巧,以及如何避免一些常见的问题。 变量与常量 Javascript中的变量和常量都是松散类型,但是我们建议使用let和const来定义变量和常量。同时,尽可能避免使用全局变量和常量,并根据…

    JavaScript 2023年5月18日
    00
  • Ajax入门学习教程(一)

    这里是Ajax入门学习教程(一)的详细攻略: 一、什么是Ajax Ajax(Asynchronous JavaScript and XML)指的是一种在Web应用中创建交互式的、快速动态的用户体验的技术。通过Ajax,你可以使用JavaScript向服务器异步发出请求,获取数据,然后将这些数据呈现在页面上。 二、Ajax实现步骤 实现Ajax主要有以下步骤:…

    JavaScript 2023年6月11日
    00
  • JavaScript面向对象编写购物车功能

    当我们在构建一个购物车功能时,可以采用JavaScript面向对象编程的方式来实现。下面是一个完整的攻略: 1. 设计购物车功能 首先要明确购物车的功能和特点,确定购物车所需要存储的数据。 在购物车中,我们需要存储商品的信息,如名称、价格、数量等,同时还需要实现添加、删除、修改商品以及计算购物车总价等功能。 我们可以创建一个Car对象来代表购物车,同时定义一…

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