Как отправить объект с Flutter на Android?

У меня есть класс во Flutter:

class Foo {
  String id;
  int power;

  Foo (this.id, this.power);

  Map toJson() => {
    'id': id,
    'power': power
  };
}

Я создал экземпляр этого объекта и передал его на Android через MethodChannel как String:

_myChannel.invokeMethod('custom_event', {
      'foo': foo.toJson().toString(),
});

В Android я извлекаю эту строку и хочу преобразовать в объект Foo на стороне Android, поэтому:

val fooString = call.method.argument<String>("foo")
//output: {id: my_id, power: 23}

val response = fooString?.let { Response(it) }
//output {"id":"my_id","power":"23"}

Вспомогательный класс:

class Response(json: String) : JSONObject(json) {
        val data = this.optJSONArray(null)
            ?.let { 0.until(it.length()).map { i -> it.optJSONObject(i) } } // returns an array of JSONObject
            ?.map { FooJson(it.toString()) } // transforms each JSONObject of the array into Foo
    }

    class FooJson(json: String) : JSONObject(json) {
        val id: String = this.optString("id")
        val power: String = this.optInt("power")
    }

Как я могу преобразовать ответ в свой класс Котлина?

Не могли бы вы указать проблему, пожалуйста? Поскольку у вас есть класс Response, который анализирует JSON. Но это выглядит странно, потому что вы пытаетесь проанализировать массив вместо объекта

powerman23rus 25.10.2022 14:08

Да, я хочу передать список объектов из Flutter в Android в виде строки, а затем снова преобразовать строку в список объектов.

Wafi_ck 25.10.2022 20:08
0
2
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку Foo содержит только строку и целое число, оба из которых поддерживаются кодеком сообщения по умолчанию, имеет смысл просто передать эти два значения в карте. (На самом деле у вас уже есть метод, создающий эту карту, toJson, хотя лучше назвать его toMap.)

Не вызывайте toString на этой карте; вместо этого используйте:

_myChannel.invokeMethod('custom_event', foo.toMap());

Теперь вы вызываете метод и передаете карту. На исходном конце вы будете искать участников, используя их ключи карты (т. е. id и power), используя .argument<T>, как вы пытались, следующим образом:

val id = call.method.argument<String>("id");

Вы можете, конечно, затем создать POJO, который обертывает объект вокруг этих двух значений, если это действительно необходимо.

Для более сложных сообщений рассмотрите Pigeon. Если вы действительно хотите использовать JSON в качестве метода сериализации, посмотрите на существующий кодек сообщений JSON.

Я хочу обработать список передачи объектов Foo, поэтому я подумал, что синтаксический анализ объекта в строку, а затем в json - хорошая идея. Я не хочу использовать какую-либо внешнюю библиотеку для этого.

Wafi_ck 25.10.2022 19:38

Это не очень хорошая идея, поскольку кодек по умолчанию уже может создавать списки, карты, строки и т. д. Зачем изобретать велосипед? Если вы хотите передать список Foos, превратите каждый Foo в карту, поместите их в список и передайте список для вызова метода. В конце Java вы получите ArrayList HashMaps - его легко пройти.

Richard Heap 25.10.2022 20:11

Что мне использовать, если в моем классе Foo есть идентификатор, мощность и еще 2 переменные?

Wafi_ck 25.10.2022 20:20

Та же карта с двумя дополнительными ключами/значениями, например {.... 'isAlive': isAlive, 'logPower': logPower}, показывающая пример возможности передать логическое значение и двойное значение напрямую.

Richard Heap 25.10.2022 20:38

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