Flutter - База данных Sembast вставка Список объектов - PullRequest
0 голосов
/ 12 мая 2019

Я собираюсь использовать базу данных «Сембаст» во Флаттере.Простые объекты с типами данных, такими как 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, имя: Apple, isSweet: true, leaves: [Экземпляр «Листья», Экземпляр «Листья», Экземпляр 'Leaves']}

Ошибка:Листья неподдерживаемого типа

Ответы [ 2 ]

1 голос
/ 13 мая 2019

Как указано, 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"
    }
  ]
}
0 голосов
/ 17 июня 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'],
    );
  }
}
...