FlutterWeb实战:06-Flutter与JavaScript通信

准备工作

Dart 调用 JS

这里面我们使用 js 库来实现 JS 调用 Dart,首先添加依赖:

  dependencies:
+   js: ^0.6.4

在 Dart 侧定义调用方法

()

class WxConfigOption {
  /// 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。
  external bool? debug;

  /// 公众号的唯一标识
  external String appId;

  /// 生成签名的时间戳
  external num timestamp;

  /// 生成签名的随机串
  external String nonceStr;

  /// 签名
  external String signature;

  /// 需要使用的 JS 接口列表
  external List<String> jsApiList;

  /// 需要跳转的标签类型
  external List<String> openTagList;

  external factory WxConfigOption({
    bool? debug,
    required String appId,
    required num timestamp,
    required String nonceStr,
    required String signature,
    required List<String> jsApiList,
    required List<String> openTagList,
  });
}
()
class Promise<T> {
  external Promise(void Function(void Function(T result) resolve, Function reject) executor);
  external Promise then(void Function(T result) onFulfilled, [Function onRejected]);
}

/// 声明调用方法
("flutterWeb")
class FlutterWeb {
  /// 配置js-sdk
  external static Promise<void> configJsSdk(WxConfigOption options);

  /// 上传图片
  external static Promise<String> uploadImage();
}

在《FlutterWeb实战:04-集成微信JS-SDK提供丰富体验》中,我们介绍了如何封装微信的 JS-SDK 方法,供 Flutter 调用。

最后在 JS 侧导出了被调用方法:

import * as flutterWeb from "./index.js";

window.flutterWeb = flutterWeb;

这样就可以在 Dart 侧调用 JS 方法了:

Future resolveSdkSign() {
  final completer = Completer<void>();
  FlutterWeb.configJsSdk(WxConfigOption(
    appId: appId,
    timestamp: timestamp,
    nonceStr: nonceStr,
    signature: signature,
    jsApiList: ['chooseImage','uploadImage'],
    openTagList: [
        'wx-open-launch-app',
        'wx-open-launch-weapp'
      ]
    )).then(allowInterop(completer.complete),
          allowInterop(completer.completeError));
  return completer.future;
}

可以以这种形式调用:

配置 JS-SDK

resolveSdkSign().then((_) {})

上传图片

FlutterWeb.uploadImage()
  .then(allowInterop(completer.complete), allowInterop(completer.completeError));

JS 调用 Dart

window.jsOnEvent("events.page.active");
('jsOnEvent')
external set _jsOnEvent(void Function(dynamic event) f);

class PlatformCallWebPlugin {
  static void registerWith(Registrar registrar) {
    final MethodChannel channel = MethodChannel(
        'nicestwood.com/forest', const StandardMethodCodec(), registrar);
    channel.setMethodCallHandler(handleMethodHandler);

    //Sets the call from JavaScript handler
    _jsOnEvent = allowInterop((dynamic event) {
      //
      if (event == 'events.page.active') {
        //  do something
      }
    });
  }
}

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少湖说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值