有没有办法在 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 访问?
在 MacOS 上为 Flutter 安装 cocoapods 时出现问题