【问题标题】:Flutter -integration of SEMBAST with built_value , how to insert the Model into the sembast dbFlutter - SEMBAST 与 built_value 的集成,如何将模型插入 sembast db
【发布时间】:2020-02-10 22:50:26
【问题描述】:

我尝试使用将 Post 对象插入 SEMBAST 数据库,但需要 toMap() 才能插入数据库 请在下面找到我的代码


import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

import '../serializers.dart';
import 'articles.dart';

part 'news.g.dart';

abstract class News implements Built<News, NewsBuilder> {
  News._();

  factory News([updates(NewsBuilder b)]) = _$News;

  @BuiltValueField(wireName: 'status')
  String get status;
  @BuiltValueField(wireName: 'totalResults')
  int get totalResults;
  @BuiltValueField(wireName: 'articles')
  BuiltList<Articles> get articles;
  String toJson() {
    return json.encode(serializers.serializeWith(News.serializer, this));
  }

  static News fromJson(String jsonString) {
    return serializers.deserializeWith(
        News.serializer, json.decode(jsonString));
  }

  static Serializer<News> get serializer => _$newsSerializer;


}

我的数据源文件是

import 'package:boilerplate/data/local/constants/db_constants.dart';
import 'package:boilerplate/models/news/news.dart';
import 'package:boilerplate/models/post/post.dart';
import 'package:boilerplate/models/post/post_list.dart';
import 'package:sembast/sembast.dart';

class NewsDataSource {
  // A Store with int keys and Map<String, dynamic> values.
  final _postsStore = intMapStoreFactory.store(DBConstants.STORE_NAME);

  // Private getter to shorten the amount of code needed to get the
  // singleton instance of an opened database.
//  Future<Database> get _db async => await AppDatabase.instance.database;

  // database instance
  final Future<Database> _db;

  // Constructor
  PostDataSource(this._db);


  // DB functions:--------------------------------------------------------------
  Future insert(News news) async {
    return await _postsStore.add(await _db, post);
  }


}

但插入语法 await _postsStore.add(await _db, post); 显示错误
Future&lt;int&gt; StoreRef.add(DatabaseClient client, Map&lt;String, dynamic&gt; value)

请帮我解决一下

【问题讨论】:

    标签: flutter flutter-dependencies flutter-test flutter-sliver sqflite


    【解决方案1】:

    如前所述,sembast 与 firestore 和 indexed_db 一样需要映射。您必须以兼容的方式使用 built_value 进行序列化。一种方法是在定义序列化程序时使用 StandardJsonPlugin:

    @SerializersFor([News])
    final Serializers serializers =
        (_$serializers.toBuilder()..addPlugin(StandardJsonPlugin())).build();
    
    

    然后您可以从您的新闻对象生成地图:

    var map = serializers.serializeWith(News.serializer, news);
    

    您的插入方法将是这样的:

    Future insert(News news) async {
      var map = serializers.serializeWith(News.serializer, news);
      return await _postsStore.add(await _db, map);
    }
    

    【讨论】:

    • 感谢@alextk 的回复,它可以工作,但会引发Unhandled Exception: type 'List&lt;Object&gt;' is not a subtype of type 'Map&lt;String, dynamic&gt;' 异常
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2019-11-20
    • 2019-09-29
    • 2020-10-27
    • 2020-11-08
    • 2020-08-29
    • 2022-12-20
    • 2021-11-02
    相关资源
    最近更新 更多