是否可以检查是否已经设置了该值?

时间:2019-12-08 00:50:24

标签: firebase flutter dart google-cloud-firestore

登录成功后我setData。除电话号码外,所有值均为空。之后,该用户可以编辑配置文件并设置displayName和email等字段。 ,但是当用户注销并登录时,所有字段再次为空。

是否可以检查是否已经有值,然后不设置该字段?

  Future<void> addUser(UserModel model){
    return _db.collection('users').document(model.uid).setData({
      'displayName':model.displayName,
      'email':model.email,
      'phone':model.phone,
      'photoUrl':model.photoUrl,
      'title':model.title,
      'vendorCircle':model.vendorCircle,
      'type':model.type,
    },merge: true);
  }

2 个答案:

答案 0 :(得分:0)

在字段上设置null值正是您要执行的操作:它在该字段上设置null。 Firestore上没有配置选项可以更改该行为。

您可以做的是在Flutter / Dart边有条件地构建模型。像这样:

var data = {
  'displayName':model.displayName,
  'email':model.email,
  'phone':model.phone,
  'photoUrl':model.photoUrl,
  'title':model.title,
  'vendorCircle':model.vendorCircle,
  'type':model.type,
};
data.removeWhere((k,v) => v == null);

_db.collection('users').document(model.uid).setData(data, merge: true);

受此comment on githubremoveWhere method文档的启发。

答案 1 :(得分:0)

解决方案

  Future<void> addUser(UserModel model) {
    if (model.photoUrl != '' &&
        model.email != '' &&
        model.displayName != '' &&
        model.title != '' &&
        model.vendorCircle != '') {
      return _db.collection('users').document(model.uid).setData({
        'displayName': model.displayName,
        'email': model.email,
        'phone': model.phone,
        'photoUrl': model.photoUrl,
        'title': model.title,
        'vendorCircle': model.vendorCircle,
        'type': model.type,
      }, merge: true);
    } else if (model.email != '' &&
        model.displayName != '' &&
        model.vendorCircle != ''){
      return _db.collection('users').document(model.uid).setData({
        'displayName': model.displayName,
        'email': model.email,
        'phone': model.phone,
        'vendorCircle': model.vendorCircle,
          'type':model.type
      }, merge: true);
    }else{
      return _db.collection('users').document(model.uid).setData({
        'phone': model.phone,
        'type':model.type
      }, merge: true);
    }
  }