我正在参加「启航计划」

系列(一):NativeBridge:基于webivew_flutter的JSBridge插件
系列(二):NativeBridge:完成原理解析
系列(三):App完成JSBridge的最佳方案
系列(四):NativeBridge:我在Pub上发布的第一个插件

前沿

坦白地说,在发布 native_bridge 之前,自己从没有想过会在 pub 上发布一款自己开发的 Flutter 插件。一方面是觉得自己水平有限,很难产出比较有实用价值的内容。尽管之前有写过 Plugin 开发相关的文章,但那也只是用来自我学习的 Demo,对大家来说没有太多的运用价值。另一方面也是由于对 pub 的发布流程非常生疏,尤其对大陆开发者来说还会遇到一些额外的问题。

而这次能够促使我去发布 NativeBridge 插件,首要还是之前的 NativeBridge 系列文章在的受欢迎度较高,让我感触到了它存在的价值。另一个原因是之前对掘友的许诺,之前掘友希望 NativeBridge 能够适配 webview_flutter ^4.0.1 以上的版别。

NativeBridge:我在Pub上发布的第一个插件

尽管间隔上次的回复现已过去了一个多月,但我最终还是完成了许下的许诺^ ^。

NativeBridge 插件

NativeBridge 是基于webview_flutter插件来完成App端H5端 JS 互调才能的插件。 其详细功用阐明请跳转 Readme 检查,这儿不做过多的介绍。

NativeBridge 现在已成功发布到 pub,需求运用时直接引进即可。

NativeBridge:我在Pub上发布的第一个插件

版别更新

这儿简述下插件的版别更新内容:

v0.0.2 版别

1. 优化了音讯回复后还会导致接收端再次发一条承认音讯的问题

原来当 App 收到了 H5 回复的音讯后,还会再发送一条音讯承认音讯。这是没有必要的,这儿进行了优化。

通过在音讯实体 Message 中新增 isResponseFlag 字段来进行区分,关于 isResponseFlagtrue 的音讯,将不再发送承认音讯。

if (isResponseFlag) {
      // 是回来的恳求音讯,则处理H5回调的值
      NativeBridgeHelper.receiveMessage(messageJson);
    } else {
      ...
    }

2. 关于未识别的 Api 新增容错机制处理

跟着 App版别 的迭代,或许出现某个新的 Api 老的版别无法支持的情况,关于之前的版别来说,当 Api 不匹配时会直接丢弃音讯,等候超时机制处理。这会导致发起端出现 await 情况,直到超时触发回调。这是不适宜的,这次增加了兼容处理。

// 不是回来的恳求音讯,处理H5端的恳求
var callMethod = callMethodMap[messageItem.api];
if (callMethod != null) {
   // 有相应的JS办法,则处理
   ...
} else {
   // 若没有对应办法,则回来null,防止低版别未支持Api堵塞H5
   messageItem.data = null;
}

v1.0.0版别

1. 适配webview_flutter ^4.0.5版别

现在插件引进的 webview_flutter 版别为: ^4.0.5,后续也会跟着 webview_flutter 插件的迭代而晋级,直到其才能被官方替代停止。

NativeBridge:我在Pub上发布的第一个插件

2. 对完成方式进行重构

由于新版别的 webview_flutter 将大部分的 WebView 操作功用移入 WebViewController 处理,因此我们的 NativeBridge 插件也同步进行调整。

现在运用只需求新增 AppBridgeController 承继 NativeBridgeController 完成其对应办法即可正常运用。

class AppBridgeController extends NativeBridgeController {
  AppBridgeController(WebViewController controller) : super(controller);
  /// 指定JSChannel名称
  @override
  get name => "nativeBridge";
  @override
  Map<String, Function?> get callMethodMap => <String, Function?>{
        // 版别号
        "getVersionCode": (data) async {
          return await AppUtil.getVersion();
        },
        ...
      };
}
// 初始化AppBridgeController
_appBridgeController = AppBridgeController(_controller);

总结

关于还在运用 webview_flutter 3.0+ 版别的项目,引证 ^0.0.2版别:

native_bridge: ^0.0.2

关于运用 webview_flutter 4.0+ 版别的项目,引证 ^1.0.0版别:

native_bridge: ^1.0.0

感悟

NativeBridge插件的成功发布,这个过程中也让我受益良多。

开始学会从 SDK 开发者的视点去思考问题,测验思考如何简化插件的运用、丰富插件的才能,更关注插件的内在结构和对外的协议。也了解到在开源项目中包含开源协议、pub 的 scores 标准、README、CHANGELOG的定义等。

这也是自我的一次成长,愿你我一起共勉!