首页 > 解决方案 > 如果留空,如何不将字段保存到 Fireabse

问题描述

我有一个带有 TextFormFields 的页面 - 如果用户将其留空,我如何不将字段保存到 Firebase?我猜测if带有 的语句.isEmpty,但我不确定在哪里实现它们:

onPressed: () async {
          final uid =
              await TheProvider.of(context).auth.getCurrentUID();

          //save data to firebase

          widget.contact.name = oneController.text;
          widget.contact.phoneNumber = int.parse(twoController.text);
          widget.contact.location = threeController.text;
          widget.contact.rating = int.parse(fourController.text);
          widget.contact.instagram = fiveController.text;
          widget.contact.birthday = int.parse(sixController.text);
          widget.contact.notes = sevenController.text;

          await db
              .collection("userData")
              .doc(uid)
              .collection("Contacts")
              .add(widget.contact.toJson());

模型文件

class Contact {
int rating;
String name;
String location;
int phoneNumber;
String instagram;
int birthday;
String notes;


Contact(this.name, this.phoneNumber, this.location, this.rating,
        this.instagram, this.birthday, this.notes);


Map<String, dynamic> toJson() => {
    'Name': name,
    'PhoneNumber': phoneNumber,
    'Location': location,
    'Rating': rating,
    'Instagram': instagram,
    'Birthday': birthday,
    'Notes': notes,
    
  };
}

TextFormFields 之一的示例

TextFormField(
                controller: fourController,
                style: TextStyle(color: Colors.tealAccent),
                cursorColor: Colors.white,
                decoration:
                    textInputDecoration.copyWith(hintText: 'Rating'),
                keyboardType: TextInputType.number),

标签: firebaseflutterdartgoogle-cloud-firestore

解决方案


通常,如果我有/可能有用户未设置的信息的空字段,我只需将其上传为 null,并在显示/使用信息时处理 null 值。(不显示生日if(birthday==null))。

如果您不想这样做,您首先在Contact类中创建一个映射,然后在将映射变为 之前从映射中删除空值如何JSON?我认为这将是最简单的。

以下是如何从 dart 中的地图中删除值:

Map map = {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'};
map.remove(2); //enter the key you wish to remove

将其与 if 语句相结合,检查每个值是否为空,如果是,则将其从映射中删除。


推荐阅读