如何解决如何使用获取的 JSON 数据更新 ObservableMap 中的现有实例
考虑以下场景:
- 比方说,我们想用 mobx 编写一个书店应用
- 我在我的书域商店中有一个 ObservableMap 来保存书籍的 id 键
- 我经常通过 api 请求获取书籍更新,这些返回代表书籍的 json 对象
- 为了保持引用的完整性,mobx 推荐 updating existing instances
- 给定 json 很容易创建一本新书,但我如何将此数据合并到现有实例中(在现有地图中引用)?
明显的解决方案是自己编写合并函数,但这不是可扩展的,实际应用程序通常有一堆不同的模型。你能给我指出任何好的序列化框架,它们提供这样的合并功能(除了工厂构造函数和导出)还是我误解了一个重要的 mobx 概念?
场景的示例代码:
book_model.dart
class Book = _Book with _$Book;
abstract class _Book with Store {
final String id;
@observable
String title;
_Book({
required this.id,required this.title,});
}
book_store.dart
class BookStore = _BookStore with _$BookStore;
abstract class _BookStore with Store {
final BookService bookService;
@observable
final ObservableMap<String,Book> books;
fetchPatients() async{
final apiRes = await bookService.fetchBooks();
// somehow merge the apiRes in the existing books map
// DONT wanna do smth like this,as this would
// break existing references
books = Map.fromIterable(
apiRes.map((res)=>Book.fromJson(res)),key: (b) => b.id,calue: (b) => b,);
// instead im looking for smth like this
// which looks up matching keys and copies
// values from the new book data to the
// old one,and also adds / deletes
// new / removed keys from the old map
joinDeep(books,Map.fromIterable(
apiRes.map((res)=>Book.fromJson(res)),));
}
}
book_service.dart
class PatientService {
static final exampleData = [];
fetchBooks() async{
//do something to fetch the books from the api
final apiRes = await http.get(/*some url*/);
return apiRes;
}
}
解决方法
试试这个
books
..removeWhere((key,value) => !newBooks.containsKey(key))
..addAll(newBooks);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。