Флаттер Сембаст AddAll - PullRequest
       11

Флаттер Сембаст AddAll

0 голосов
/ 27 сентября 2019

Я пытаюсь вставить список пользователей в базу данных Sembast в Flutter.Но это не работает - я всегда получаю следующую ошибку:

Exception has occurred.
_TypeError (type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>')

Просто добавление одного пользователя - работает для меня.У меня просто проблема с добавлением списка пользователей.

Future insertAll(List<Users> users) async {
        print(jsonEncode(users));
        await _usersStore.addAll(
            await _db, jsonDecode(jsonEncode(users)));
      }

Печать дает мне следующее: [{"id": "f20ce2fb-d0db-11e9-9e8b-06ba1e206a58", "name": "Max", "lastName": "Mustermann"}]

Ответы [ 3 ]

0 голосов
/ 27 сентября 2019

1 Вы можете перепечатать свой класс User.потому что ваша ошибка в том, что Users он напечатан в виде списка и вы передаете и карту.

2 Вы можете добавить поле в User class: List<Map<dinamic, dynamic>>

или просто использовать метод .add ().

Я настоятельнорекомендует использовать .add()

0 голосов
/ 30 сентября 2019

Я думаю, проблема в том, что jsonDecode не соответствует ожидаемому типу.Вы должны рассмотреть приведение с использованием такой функции, как:

/// This properly cast a decoded json list of object
List<Map<String, dynamic>> asMapList(dynamic list) {
  return (list as List)?.cast<Map<String, dynamic>>();
}

Простой тест, подобный этому, должен работать (при условии, что db - открытая база данных):

test('jsonDecode', () async {
  var store = intMapStoreFactory.store();

  var list = [
    {'test': 'value'}
  ];

  var toAdd = jsonDecode(jsonEncode(list));

  try {
    // This fails
    await store.addAll(db, toAdd);
    fail('should fail');
  } catch (e) {
    expect(e, isNot(const TypeMatcher<TestFailure>()));
    print(e);
  }

  // This works!
  await store.addAll(db, asMapList(toAdd));
});
0 голосов
/ 27 сентября 2019

Что если вы используете foreach и вставляете по одному за раз?

Я знаю, что это может быть не то, что вы ищете, но это способ продолжать работать, пока вы не найдете способ сделать это!

Future insertAll(List<Users> users) async {
    print(jsonEncode(users));
    users.foreach((user) async{
      // insert here
    });

  }
...