【问题标题】:Flutter Sembast AddAllFlutter Sembast AddAll
【发布时间】:2020-01-28 02:13:58
【问题描述】:

我正在尝试将用户列表插入到 Flutter 中的 Sembast 数据库中。但这不起作用 - 我总是收到以下错误:

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"}]

【问题讨论】:

  • 您对jsonDecode(jsonEncode(users)) 的意图是什么?我想您需要将 List 转换为 List>。 User 上是否有生成 Map 的函数,主要类似于 toJson?如果是,您可以使用users.map((u) =&gt; u.toJson()).toList() 代替jsonDecode(jsonEncode(users))
  • 谢谢你 - 这行得通!

标签: database flutter dart flutter-dependencies


【解决方案1】:

1 - 您可以重新输入您的 User 类,因为您的错误是因为 Users 被输入为 List&lt;dynamic&gt; 并且您正在传递和映射。

2 - 您可以在 User 类中添加一个字段:List&lt;Map&lt;dynamic, dynamic&gt;&gt;

或者干脆使用.add() 方法。

我强烈推荐使用.add()

【讨论】:

    【解决方案2】:

    我认为问题在于 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));
    });
    

    【讨论】:

      【解决方案3】:

      如果你使用 foreach 并一次插入一个呢?

      我知道这可能不是您想要的,但它是一种继续工作的方法,直到您找到方法为止!

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-27
        • 2020-02-10
        • 2019-11-20
        • 2020-08-29
        • 2019-09-29
        • 2021-11-02
        • 2020-11-08
        • 2022-12-20
        相关资源
        最近更新 更多