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?
Есть вещи, которые вы можете сделать:
Сериализация Java-объекта в JSON, передача строки, а затем десериализация в виде объекта Dart.
Поместите поля объекта Java в HashMap (ключ - строка, значение - поддерживаемый тип), передайте его (будет отображаться как
Map<String, dynamic>
) и доступ к полям.Напишите свой собственный кодек (или подкласс стандартного кодека), где вы в итоге выполняете (2), но с меньшими издержками на имена строковых полей. (Это сложно...)