有没有办法在 Flutter 上为 firestore 数据库生成模型类?

Posted

技术标签:

【中文标题】有没有办法在 Flutter 上为 firestore 数据库生成模型类?【英文标题】:is there a way to generate model class for firestore database on Flutter? 【发布时间】:2020-06-16 18:58:21 【问题描述】:

我目前正在手动执行此过程。这是一个示例数据类。有没有办法自动生成?

class RideModel 
  final String docId;
  final bool hasRequest;
  final String rideCollectionId;
  final String vehicleTypeId;
  final double corporationRate;
  final double driverRate;
  final double driverInsurance;
  final double passengerInsurance;
  final List startUpCharge;
  final double waitingCharge;
  final double normalCharge;

  RideModel(this.docId, this.hasRequest, this.rideCollectionId,this.vehicleTypeId, this.corporationRate, this.driverRate, this.driverInsurance, this.passengerInsurance, this.startUpCharge, this.waitingCharge, this.normalCharge);

  factory RideModel.fromFirestore(DocumentSnapshot doc) 
    var data = doc.data;

    return RideModel(
        docId: data['docId'],
        hasRequest: data['hasRequest'],
        rideCollectionId: data['rideCollectionId'],
        vehicleTypeId: data['tripDetails']['vehicleType']['vehicleTypeId'],
        corporationRate: data['tripDetails']['vehicleType']['corporation'].toDouble()??0.0,
        driverRate: data['tripDetails']['vehicleType']['driver'].toDouble()??0.0,
        driverInsurance: data['tripDetails']['vehicleType']['driverInsurance'].toDouble()??0.0,
        passengerInsurance: data['tripDetails']['vehicleType']['passengerInsurance'].toDouble()??0.0,
        normalCharge: data['tripDetails']['vehicleType']['normalCharge'].toDouble()??0.0,
        startUpCharge: data['tripDetails']['vehicleType']['startUpCharge']??[],
        waitingCharge: data['tripDetails']['vehicleType']['waitingCharge'].toDouble()??0.0);
  

【问题讨论】:

有几个包可用于 json 到模型的转换。为什么不在 pub dev 上搜索? 有趣,我希望有一个,这里也是手动编码。 看看这个flutter.dev/docs/development/data-and-backend/json。这可能会对您有所帮助。 【参考方案1】:

正如@Alex Sunder Singh 在 cmets 上和对此Community post 的答案之一所述,您可以使用JsonSerializable() 来执行此操作。

为了使用它,你必须在你的 pubspec.yaml 上设置这些依赖

dependencies:
  # Your other regular dependencies here
  json_annotation: <latest_version>

dev_dependencies:
  # Your other dev_dependencies here
  build_runner: <latest_version>
  json_serializable: <latest_version>

然后,将 @JsonSerializable() 注释添加到您的类以及将包导入您的类,它看起来像这样

import 'package:json_annotation/json_annotation.dart';

@JsonSerializable()
class RideModel 
  final String docId;
  final bool hasRequest;
  final String rideCollectionId;
  final String vehicleTypeId;
  final double corporationRate;
  final double driverRate;
  final double driverInsurance;
  final double passengerInsurance;
  final List startUpCharge;
  final double waitingCharge;
  final double normalCharge;

  RideModel(this.docId, this.hasRequest, this.rideCollectionId,this.vehicleTypeId, this.corporationRate, this.driverRate, this.driverInsurance, this.passengerInsurance, this.startUpCharge, this.waitingCharge, this.normalCharge);

  factory RideModel.fromJson(Map<String, dynamic> json) => _$RideModelFromJson(json);

  Map<String, dynamic> toJson() => _$RideModelToJson(this);

注意:如果您希望将所有非原始对象描述为 json 而不是“对象实例”,请使用 @JsonSerializable(explicitToJson: true)

最后,通过从终端运行代码生成实用程序来生成 JSON 序列化代码

flutter packages pub run build_runner build

这样您就可以使用toJson() 将数据映射到您的对象,并使用fromJson() 将您的对象作为数据发送。

希望这会有所帮助。

【讨论】:

【参考方案2】:

我个人更喜欢使用在线工具...https://app.quicktype.io/ 这可能就是您所需要的。

【讨论】:

【参考方案3】:

如果您使用 VS Code,您也可以直接执行 ⌘ + . (Mac),然后自动点击 “生成数据类”根据类的属性生成 toJson 和 fromJson 方法。

如果您有嵌套数据,这些对象也应该有 fromJson 和 toJson,因此“生成数据类”命令可以在 fromJson 和 toJson 方法中自动使用它们。

这样你就不需要任何外部工具了。

【讨论】:

分享需要安装此扩展才能使其工作可能会有所帮助:marketplace.visualstudio.com/…。谢谢。

以上是关于有没有办法在 Flutter 上为 firestore 数据库生成模型类?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 Android Webview(使用 CSP)上为 WebWorker 启用 fileuri 访问?

如何在键盘外观上为 Flutter 布局设置动画

在 MacOS 上为 Flutter 安装 cocoapods 时出现问题

如何在同一设备上为不同的项目使用两个版本的颤振?

将 cloud_firestore 添加到 pubspec Flutter 后无法为模拟器构建应用程序

iOS Flutter 没有收到推送通知