Flutter - методы привязки PlatformChannel, которые возвращают пользовательские объекты

Я играю с PlatformChannel и MethodChannel в Flutter. Выполнение некоторых основных операций... работа над портированием opencv для флаттера... но я не могу понять, как это решить!


Нет проблем с вызовом простых методов, которые возвращают объекты базовых типов, например:

Android:

@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();
    }
  }

Dart:

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


Но что, если у меня есть какой-то пользовательский объект? Что-то вроде:
Android:

  @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();
    }
  }
}

Dart:

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

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

Как реализовать класс Scalar dart? Мне нужно переписать класс, начиная с оригинальных источников или как?


Спасибо за внимание.

1 ответ

Решение

StandardMessageCodec можно отправлять только определенные типы через границу. Кроме того, вы не можете отправить Java-класс через границу - во что он превратится в конце Dart?

Есть вещи, которые вы можете сделать:

  1. Сериализация Java-объекта в JSON, передача строки, а затем десериализация в виде объекта Dart.

  2. Поместите поля объекта Java в HashMap (ключ - строка, значение - поддерживаемый тип), передайте его (будет отображаться как Map<String, dynamic>) и доступ к полям.

  3. Напишите свой собственный кодек (или подкласс стандартного кодека), где вы в итоге выполняете (2), но с меньшими издержками на имена строковых полей. (Это сложно...)

Другие вопросы по тегам