2

我在 Flutter 中使用 PlatformChannel 和 MethodChannel。做一些基本的操作......为颤振做一个opencv移植......但我不知道如何解决这个问题!


调用返回基本类型对象的简单方法没有问题,如下所示:

安卓:

@Override
  public void onMethodCall(final MethodCall call, final Result result) {
    switch (call.method) {
      case "getVersionString":
        result.success(org.opencv.core.Core.getVersionString());
        break;
      default:
        result.notImplemented();
    }
  }

镖:

Future<String> get versionString async {
  return await _channel.invokeMethod('getVersionString') as String;
}


但是如果我有一些自定义对象呢?类似的东西:
安卓:

  @Override
  public void onMethodCall(final MethodCall call, final Result result) {
    switch (call.method) {
      case "getVersionString":
        result.success(org.opencv.core.Core.getVersionString());
        break;
      case "Scalar":
        result.success(org.opencv.core.Core.Scalar());
        break;
      default:
        result.notImplemented();
    }
  }
}

镖:

class Scalar {
  static const MethodChannel _channel = MethodChannel('flutter_opencv');

  // WHAT TO DO HERE??????
}  

如何实现标量飞镖类?我需要从原始资源开始重写课程还是什么?


感谢您的关注。

4

1 回答 1

7

StandardMessageCodec只能跨边界发送某些类型。此外,您不能跨边界发送 Java 类——它在 Dart 端会变成什么?

您可以做一些事情:

  1. 将 Java 对象序列化为 JSON,传输字符串,然后反序列化为 Dart 对象

  2. 将 Java 对象的字段放入 HashMap(key 是字符串,value 是支持的类型),传输它(将显示为 a Map<String, dynamic>)并访问字段。

  3. 编写您自己的编解码器(或标准编解码器的子类),您最终基本上会执行 (2),但字符串字段名称的开销较少。(这很棘手……)

于 2019-07-01T16:52:57.470 回答