You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为使用Cloud Firestore的Flutter线上应用数据模型添加新字段

为Flutter Firestore数据模型添加必填字段size的解决方案

现有基于Firebase Firestore的Flutter应用,原Product数据模型未包含size字段,现在需要将size设为必填字段,但数据库中部分旧文档尚未更新该字段,需兼容这种情况。

重写后的完整Product.dart代码

import 'dart:convert';
import 'package:cloud_firestore/cloud_firestore.dart';

class Product {
  final String name;
  final double price;
  // 新增必填的size字段
  final String size;

  // 构造函数添加size参数,标记为required
  Product({required this.name, required this.price, required this.size});

  Map<String, dynamic> toMap() {
    return {
      "name": name,
      "price": price,
      // 新增size字段到映射中,确保新数据写入Firestore时包含该字段
      "size": size
    };
  }

  factory Product.fromMap(Map<String, dynamic> json) {
    return Product(
      name: json["name"],
      // 优化price转换:适配Firestore中price可能为int/double的情况
      price: (json["price"] as num).toDouble(),
      // 兼容旧文档:检查是否存在size字段,不存在则用默认值'not known'
      size: json.containsKey('size') ? json["size"] : 'not known'
    );
  }

  factory Product.fromRawJson(String str) => Product.fromMap(json.decode(str));

  String toRawJson() => json.encode(toMap());
}

关键改动说明

  • 类成员与构造函数:新增final String size成员,并在构造函数中添加required this.size,确保实例化时必须传入size值。
  • toMap方法:加入"size": size,保证新创建的Product对象写入Firestore时会包含size字段,避免新数据出现缺失。
  • fromMap方法:通过json.containsKey('size')判断字段是否存在,对未更新的旧文档返回默认值'not known',避免解析报错。
  • price转换优化:将原double.parse(json["price"].toString())改为(json["price"] as num).toDouble(),适配Firestore中price可能存为int或double的情况,更健壮。

内容的提问来源于stack exchange,提问作者pbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 02:42:26