繁体   English   中英

如何在 Flutter 上的 Firestore 中序列化/建模模型 json 数据

[英]How to serialize/model inside model json data from Firestore on Flutter

如何使用颤振数据建模技术访问“HH”和“mm”? 我一直在尝试按如下方式使用它,但它在下面给出了错误。

在此处输入图像描述

我的数据模型目前是它的简化版本。

class Week {
  final String label;
  final String value;

  Week({@required this.label, @required this.value});

  factory Week.fromJson(Map<String, dynamic> doc) {
    return Week(
      label: doc['label'] ?? '',
      value: doc['value'] ?? 0,
    );
  }
}

class IntervalTime {
  final String hh;
  final String mm;

  IntervalTime({@required this.hh, @required this.mm});

  factory IntervalTime.fromJson(Map<String, dynamic> doc) {
    return IntervalTime(
      hh: doc['HH'] ?? '',
      mm: doc['mm'] ?? '',
    );
  }
}

class Diary {
  final String message;
  final List<Week> weeklyFreq;
  final Timestamp annualFreq;
  final IntervalTime start;

  Diary(
      {@required this.message,
      @required this.weeklyFreq,
      @required this.annualFreq,
      @required this.start});

  factory Diary.fromFirestore(DocumentSnapshot doc) {
    Map data = doc.data;
    return Diary(
      message: data['message'] ?? '',
      weeklyFreq: data['weeklyFreq'].cast<List<Week>>() ?? [],
      annualFreq: data['annualFreq'] ?? Timestamp,
      start: data['start'].cast<IntervalTime>() ?? '',
    );
  }
}

日志记录如下。

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: type 'CastList<dynamic, List<Week>>' is not a subtype of type 'List<Week>'

解决方法如下。 唯一最重要的是在数据声明中再次转换 json 数据。 此外,在数据对象内部序列化数据是一种混乱,因为有足够的资源来映射对象内部的对象。

class Week {
  final String label;
  final int value;

  Week({@required this.label, @required this.value});

  factory Week.fromJson(Map<String, dynamic> data) {
    // Map<String, dynamic> data = json.decode(doc);
    return Week(
      label: data['label'] ?? '',
      value: data['value'] ?? 0,
    );
  }
}

class IntervalTime {
  final String hh;
  final String mm;

  IntervalTime({@required this.hh, @required this.mm});

  factory IntervalTime.fromJson(Map data) {
    return IntervalTime(
      hh: data['HH'] ?? '',
      mm: data['mm'] ?? '',
    );
  }
}

class Diary {
  final String message;
  final List<Week> weeklyFreq;
  final Timestamp annualFreq;
  final IntervalTime start;

  Diary(
      {@required this.message,
      @required this.weeklyFreq,
      @required this.annualFreq,
      @required this.start});

  factory Diary.fromFirestore(DocumentSnapshot doc) {
    Map data = doc.data;
    return Diary(
      message: data['message'] ?? '',
      weeklyFreq: (data['weeklyFreq'] as List)
          ?.map((e) => e == null ? null : Week.fromJson(e))
          ?.toList(), // Workaround
      annualFreq: data['annualFreq'] ?? Timestamp,
      start: IntervalTime.fromJson(data['start']), // workaround
    );
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM