Flutter - Вставка в базу данных Sembast Список объектов

Я собираюсь использовать базу данных «Сембаст» во Flutter. Простые объекты с такими типами данных, как string и int, работают правильно. Однако при использовании списков это становится проблематичным.

Я создал пример и ориентировался на следующий учебник: https://resocoder.com/2019/04/06/flutter-nosql-database-sembast-tutorial-w-bloc/ В моем примере есть фрукты и листья как объекты. Плод содержит список листьев.

class Fruit {
  final String id;
  final String name;
  final bool isSweet;
  final List<Leaves> leaves;
...
}

class Leaves {
  final String id;
  final String name;
...
}

//Create a sample object
var leaveOne = Leaves(id: "1", name: "leaveOne");
var leaveTwo = Leaves(id: "2", name: "leaveTwo");
var leaveThree = Leaves(id: "3", name: "leaveThree");

var leavesList = List<Leaves>();
leavesList.add(leaveOne);
leavesList.add(leaveTwo);
leavesList.add(leaveThree);

var fruit = Fruit(id: "1", name: "Apple", isSweet: true, leaves: leavesList);
_fruitDao.insert(fruit);


// The fruitDao.insert makes following
Future insert(Fruit fruit) async {
  await _fruitStore.add(await _db, fruit.toJson());
}

JSON выглядит так: {id: 1, name: Apple, isSweet: true, leaves: [Экземпляр «Листья», Экземпляр «Листья», Экземпляр «Листья»]}

ОШИБКА следующая: [ОШИБКА: flutter / lib / ui / ui_dart_state.cc (148)] Необработанное исключение: недопустимые аргументы: значение Экземпляр неподдерживаемого типа 'Leaves' оставляет


person max    schedule 12.05.2019    source источник


Ответы (2)


Как указано, Instance of 'Leaves' не является допустимым типом, поэтому каждый Leave также должен быть преобразован. Трудно догадаться, что вы делаете, не видя своего toJson(), но что-то вроде этого должно работать (можно в значительной степени оптимизировать):

class Fruit {
  final String id;
  final String name;
  final bool isSweet;
  final List<Leaves> leaves;

  Fruit({this.id, this.name, this.isSweet, this.leaves});

  Map<String, dynamic> toJson() => <String, dynamic>{
        'id': id,
        'name': name,
        'isSweet': isSweet,
        'leaves': leaves?.map((leave) => leave.toJson())?.toList(growable: false)
      };
}

class Leaves {
  final String id;
  final String name;

  Leaves({this.id, this.name});

  Map<String, dynamic> toJson() => <String, dynamic>{'id': id, 'name': name};
}

и ваш json должен выглядеть примерно так:

{
  "id": "1",
  "name": "Apple",
  "isSweet": true,
  "leaves": [
    {
      "id": "1",
      "name": "leaveOne"
    },
    {
      "id": "2",
      "name": "leaveTwo"
    },
    {
      "id": "3",
      "name": "leaveThree"
    }
  ]
}
person alextk    schedule 13.05.2019
comment
Спасибо за ответ! Я использую json_serializable - package. Таким образом, это генерирует мне код для функций toJson() и fromJson(). Если я отредактирую этот сгенерированный файл (обычно этого делать не следует) и вставлю ваш код для сопоставления листьев ('leaves': leaves?.map((leave) => leave.toJson())?.toList(growable: false)) - он будет работать нормально. - person max; 13.05.2019

Вот пример в дополнение к ответу @alextk с преобразованием в и из без генерации кода или библиотеки.

class Fruit {
  final String id;
  final String name;
  final bool isSweet;
  final List<Leaves> leaves;

  Fruit({this.id, this.name, this.isSweet, this.leaves});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'isSweet': isSweet,
      'leaves': leaves.map((leave) => leave.toMap()).toList(growable: false)
    };
  }

  static Fruit fromMap(Map<String, dynamic> map) {
    return Fruit(
      id: map['id'],
      name: map['name'],
      isSweet: map['isSweet'],
      leaves: map['leaves'].map((mapping) => Leaves.fromMap(mapping)).toList().cast<Leaves>(),
    );
  }
}

class Leaves {
  final String id;
  final String name;

  Leaves({this.id, this.name});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
    };
  }

  static Leaves fromMap(Map<String, dynamic> map) {
    return Leaves(
      id: map['id'],
      name: map['name'],
    );
  }
}
person bnxm    schedule 17.06.2019
comment
Вместо использования статического метода fromMap вы можете очень хорошо использовать метод Factory - person Fardeen Khan; 22.03.2020