JS 与 Native 通信

准备工作

SDK 集成

无需任何额外配置。

Kraken Widget 集成

需要给 Kraken 对象传入 KrakenNativeChannel() 才可以实现 js 与 native 的通信。

  1. Kraken(
  2. bundlePath: 'assets/bundle.js',
  3. javaScriptChannel: KrakenNativeChannel(),
  4. )

在 JS 环境中与 Native 通信

Kraken 在 JS 环境中添加了 kraken 的全局对象,在这个全局对象上有 kraken.methodChannel 对象,用于实现和 Native 的消息通信。

在 JS 中调用 kraken.methodChannel.invokeMethod 就可以调用客户端实现的函数,其中第一个参数为函数名,剩下的其余参数都是传递到客户端的调用参数。

调用客户端实现某个方法

  1. kraken.methodChannel
  2. .invokeMethod('somemethod', 'parameter 1', ['parameter 2'], {
  3. value: 'parmeter 3',
  4. })
  5. .then(result => {
  6. console.log('data from native', result);
  7. })
  8. .catch(err => {
  9. console.log('some error occured', err);
  10. });

注:在 JS 测会被强制转成 null 的类型:NaN,undefined。

处理客户端触发的一些回调

在任何时刻,客户端都可以主动调用 JavaScript 所实现的方法,即使现在 JavaScript 还没有调用客户端任何方法。

在默认情况下,客户端发送过来的任何调用都会被抛弃,除非使用 JavaScript 调用 kraken.methodChannel.addMethodCallHandler 注册一个处理函数。

在设置了处理函数之后,任何客户端发送过来的任何调用都将调用这个处理函数。

  1. kraken.methodChannel.addMethodCallHandler((method, args) => {
  2. switch (method) {
  3. case 'foo':
  4. handleFoo(args);
  5. break;
  6. case 'bar':
  7. handleBar(args);
  8. break;
  9. }
  10. });

如果注册了多个处理函数,那么一次客户端的调用,每个注册的处理函数都将被运行。

在 Native 中与 JS 进行通讯

由于 Kraken 有两种不同的集成方式:直接集成到 Flutter 中和使用 SDK 进行集成。 两种不同到集成方式与 JS 进行通讯到方式也不一样。

Kraken 分别针对以上场景提供了相应的 API。

在 Dart 环境中与 JS 进行通讯

如果采用了直接集成到 Flutter 中的方式,可以使用 KrakenJavaScriptChannel 类,来实现和 JavaScript 的通讯。

处理 JS 侧的调用过来的方法

  1. KrakenJavaScriptChannel javaScriptChannel = KrakenJavaScriptChannel();
  2. javaScriptChannel.onMethodCall = (String method, dynamic arguments) async {
  3. Completer completer = Completer<String>();
  4. Timer(Duration(seconds: 1), () {
  5. completer.complete('helloworld');
  6. });
  7. return completer.future;
  8. };
  9. Krake kraken = Kraken(
  10. bundlePath: 'assets/bundle.js',
  11. javaScriptChannel: javaScriptChannel,
  12. ),

KrakenJavaScriptChannel.onMethodCall 赋值一个回调函数来处理来自 JavaScript 的调用,返回值是一个 Future 类型,即可以进行一些异步调用后进行返回。

直接调用 JavaScript 注册的方法

除了被动接收来自 JavaScript 的调用之外,在 Dart 环境中也可以直接调用 invokeMethod 方法来调用 JS 环境中注册的方法。 这个方法调用会触发 JS 环境中 kraken.methodChannel.addMethodCallHandler 函数所注册的回调。

调用 JS 侧的函数

  1. KrakenJavaScriptChannel javaScriptChannel = KrakenJavaScriptChannel();
  2. Timer(Duration(seconds: 1), () {
  3. javaScriptChannel.invokeMethod('hello', [1234]);
  4. });
  5. Kraken kraken = Kraken(
  6. bundlePath: 'assets/bundle.js',
  7. javaScriptChannel: javaScriptChannel,
  8. ),

在 Objective-C/Swift 环境中与 JS 进行通讯

引入 KrakenSDK

  1. #import <kraken_sdk/Kraken.h>

处理 JS 的函数调用

使用 FlutterEngine 初始化一个 Kraken 实例并调用 registerMethodCallHandler 来注册一个回调函数。通过此回调实现供 JS 调用的各个函数。

Swift

  1. // 初始化 Kraken 插件
  2. let kraken = Kraken.init(flutterEngine: flutterViewController.engine)
  3. // 注册一个处理 JS 调用的回调函数
  4. kraken.registerMethodCallHandler({ (call: FlutterMethodCall, result: FlutterResult) in
  5. // 调用 JS 的函数
  6. result("method: " + call.method)
  7. })

调用 JS 函数

调用 invokeMethod 方法也可以调用由 JS 来实现的函数方法。

Swift

  1. kraken.invokeMethod(call.method, arguments: call.arguments)

在 Java/Kotlin 环境中与 JS 进行通讯

引入 KrakenSDK

  1. import com.openkraken.kraken.Kraken;

处理 JS 的函数调用

使用 FlutterEngine 初始化一个 Kraken 实例并调用 registerMethodCallHandler 来注册一个回调函数。通过此回调来实现供 JS 来调用的各个函数。

Kotlin

  1. class MainActivity: FlutterActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. var kraken = Kraken(flutterEngine)
  5. kraken.registerMethodCallHandler { call, result ->
  6. print("method " + call.method) // helloworld
  7. result.success("helloworld")
  8. }
  9. }
  10. override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
  11. GeneratedPluginRegistrant.registerWith(flutterEngine);
  12. }
  13. }

调用 JS 函数

Kotlin

  1. kraken.invokeMethod("helloworld", "1234")