【问题标题】:Flutter: Add list of object to FirestoreFlutter:将对象列表添加到 Firestore
【发布时间】:2021-07-22 08:21:29
【问题描述】:

我在 Firestore 文档中有一个数组。该数组存储一个地图列表。

Firestore Structure

所以,我想更新特定索引处的数据,但 Firestore 不允许更新索引。所以我必须检索整个数组并按对象更新数据,然后将数组上传回 Firestore。但是,我不断收到此错误,其中显示“无效参数:'Evaluate..'的实例”该数组位于 Evaluate 对象列表中。

class Evaluate {
  String sb;
  double mk;

  Evaluate({this.sb, this.mk});
}

class EvaluateList {
  List<dynamic> evaluateList = [];

  EvaluateList({this.evaluateList});
}

我遇到了死胡同,因为我现在不知道如何上传它,因为它在地图中,我尝试了一切。我并没有真正练习地图,因为它对我来说是新事物,但必须为这些数据应用地图,因为它是唯一的方法,现在我没有时间尝试和出错了。那么任何人都可以帮我解决这个问题吗?在此先感谢:)

这是我的 Firestore 函数:

    Future getEvData(String sEv, double nEv) async {

    //manage document snapshot
    DocumentSnapshot evSnapshot = await evCollection.document(uid).get();
    var evMap = evSnapshot.data['evaluate'];
    List<Evaluate> dataEv = extractEvaluation(evMap);

    // calculation for new data
    double oldEv;
    int index = 0;
    int evIndex;

    dataEv.forEach((e) {
      if (e.sb == sEv) {
        oldEv = e.mk;
        evIndex = index;
      }
      index++;
    });

    double newEv = (oldEv + nEv) / 2;
    double percentEv = newEv / 5 * 100;
    dataEv[evIndex].mk = percentEv;

    // update to firestore
    return await evCollection.document(uid).updateData({
      "evaluate": dataEv,
    });

  }

如果您找到更好的方法来构建我的数据库和更简单的查询方法,您可能会提出建议,因为我还在学习..

【问题讨论】:

    标签: flutter google-cloud-firestore


    【解决方案1】:

    我将在这里忽略模型类Evaluate,因为它是多余的。 所以dataEvList&lt;Map&lt;String, dynamic&gt;&gt;。您首先需要从列表中删除确切的元素。 使用removeAt

    dataEv.dataEv.removeAt(index);
    

    或当 'mk 为 30 时使用 removeWhere

    dataEv.removeWhere((item) => item['mk'] == 30);
    

    当“sb”是“化学”时

    dataEv.removeWhere((item) => item['sb'] == 'chemistry');
    

    然后你必须向列表中添加一个新元素。例如,如果你想将 'sb' 化学的 'mk' 从 30 更新到 50。你可以这样做。

    dataEv.add({'mk': 50, 'sb': 'chemistry'});
    

    如果你想更新“sb”,那么你可以像这样更改“sb”值

    dataEv.add({'mk': 30, 'sb': 'physics'});
    

    但是,如果您想更新同一索引处的元素,则必须首先使用indexOfindexWhere 存储删除的元素索引,然后使用此索引使用insert 更新列表。但我认为你不需要这样做。既然你可以轻松sort列表。

    最后,将dataEv 更新到firestore。

    【讨论】:

    • 非常感谢您的回答。非常感谢您花时间查看我的代码。我在 removeWhere 上遇到错误,因为我的列表是固定长度的。但是,您认为先删除然后添加新数据真的很有帮助,因为我可以做到。因此,我使用 arrayRemove 从数组中删除特定映射。我没有更新整个数组,而是添加了之前删除的新更新数据。再次,谢谢你:)
    • 这是题外话,但我认为将变量命名为人类可读以消除混淆是一个好习惯。而不是 mk, sb, Ev name 然后像标记,主题,评估。使用removeWhere 时会遇到什么样的错误?修好没关系。
    • 哈哈,我会的。变量尚未最终确定,我习惯用小数据测试代码也意味着使用简单的变量,因此很容易检测错误并进行更改。但是感谢您的建议:)
    猜你喜欢
    • 2019-09-13
    • 1970-01-01
    • 2020-08-06
    • 2020-08-27
    • 2020-06-07
    • 2018-12-12
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多