firebase - 向Cloud Firestore添加阵列(Flutter/Dart)

标签 firebase flutter dart google-cloud-firestore

您好,我正在尝试将名为“fitbit_activity”的文档添加到具有距离数组的“fitbit_activity”集合中,这是我根据Fitbit的JSON自行创建的模型。因此,该模型如下所示:

class Distances {
  String activity;
  var distance;

  Distances({this.activity, this.distance});

  factory Distances.fromJson(Map<String, dynamic> parsedJson) {
    return Distances(
        activity: parsedJson['activity'],
        distance: parsedJson['distance'].toDouble());
  }
}

Here is what the API Response for 'Distances' Look like : 
    "distances": [
        {
            "activity": "total",
            "distance": 5.94
        },
        {
            "activity": "tracker",
            "distance": 5.94
        },
        {
            "activity": "loggedActivities",
            "distance": 0
        },
        {
            "activity": "veryActive",
            "distance": 1.92
        },
        {
            "activity": "moderatelyActive",
            "distance": 0.46
        },
        {
            "activity": "lightlyActive",
            "distance": 3.26
        },
        {
            "activity": "sedentaryActive",
            "distance": 0.23
        }
    ],

最后,这是我的代码,将数据添加到我的firestore数据库中:
db = Firestore.instance();
    await db
        .collection('users')
        .document(userData[index].uID)
        .collection('fitbit_activity')
        .document(DateFormat.yMMMd().format(today))
        .setData({
      'caloriesBMR': _fitbitActivityApiVar.summary.caloriesBMR,
      'caloriesBurned': _fitbitActivityApiVar.summary.caloriesBurned,
      'fairlyActiveMinutes': _fitbitActivityApiVar.summary.lightlyActiveMinutes,
      'lightlyActiveMinutes': _fitbitActivityApiVar.summary.fairlyActiveMinutes,
      'veryActiveMinutes': _fitbitActivityApiVar.summary.veryActiveMinutes,
      'sedentaryMinutes': _fitbitActivityApiVar.summary.sedentaryMinutes,
      'steps': _fitbitActivityApiVar.summary.steps,
      'restingHeartRate': _fitbitActivityApiVar.summary.restingHeartRate,
      'distances': _fitbitActivityApiVar.summary.distances //I am getting an error here
    });

这是错误:
E/flutter ( 4149): [ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: Invalid argument: Instance of 'Distances'
E/flutter ( 4149): #0      StandardMessageCodec.writeValue 
package:flutter/…/services/message_codecs.dart:392
E/flutter ( 4149): #1      FirestoreMessageCodec.writeValue 
package:cloud_firestore/src/firestore_message_codec.dart:64
E/flutter ( 4149): #2      StandardMessageCodec.writeValue 
package:flutter/…/services/message_codecs.dart:382
E/flutter ( 4149): #3      FirestoreMessageCodec.writeValue 
package:cloud_firestore/src/firestore_message_codec.dart:64
E/flutter ( 4149): #4      StandardMessageCodec.writeValue.<anonymous closure> 
package:flutter/…/services/message_codecs.dart:389
E/flutter ( 4149): #5      _LinkedHashMapMixin.forEach  (dart:collection-patch/compact_hash.dart:377:8)
E/flutter ( 4149): #6      StandardMessageCodec.writeValue 
package:flutter/…/services/message_codecs.dart:387
E/flutter ( 4149): #7      FirestoreMessageCodec.writeValue 
package:cloud_firestore/src/firestore_message_codec.dart:64
E/flutter ( 4149): #8      StandardMessageCodec.writeValue.<anonymous closure> 
package:flutter/…/services/message_codecs.dart:389
E/flutter ( 4149): #9      _LinkedHashMapMixin.forEach  (dart:collection-patch/compact_hash.dart:377:8)
E/flutter ( 4149): #10     StandardMessageCodec.writeValue 
package:flutter/…/services/message_codecs.dart:387
E/flutter ( 4149): #11     FirestoreMessageCodec.writeValue 
package:cloud_firestore/src/firestore_message_codec.dart:64
E/flutter ( 4149): #12     StandardMethodCodec.encodeMethodCall 
package:flutter/…/services/message_codecs.dart:524
E/flutter ( 4149): #13     MethodChannel.invokeMethod 
package:flutter/…/services/platform_channel.dart:311
E/flutter ( 4149): <asynchronous suspension>
E/flutter ( 4149): #14     DocumentReference.setData 
package:cloud_firestore/src/document_reference.dart:51

我应该在 map 内编写一个循环,以便将其添加到数据库中吗?任何帮助将不胜感激!先感谢您!

最佳答案

好像您缺少Distances类的序列化方法。

添加执行此操作的toJson方法:

class Distances {
  ...
  Map<String, dynamic> toJson() {
    return {
      "activity": activity,
      "distance": distance,
    };
  }
}

然后,在将数据存储到Firestore之前,必须为数组中的每个项目添加对该方法的调用

 ...
  'distances': _fitbitActivityApiVar
    .summary
    .distances
    .map((distance) => distance.toJson())
    .toList(),
});

希望对你有用

关于firebase - 向Cloud Firestore添加阵列(Flutter/Dart),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58731742/

相关文章:

java - 即使应用在线,也先查询 Firestore 离线数据

firebase - 配置 Firestore 规则,以便用户仅获取自己拥有的记录

dart - 如何检查用户是否已登录,如果已登录则显示其他屏幕?

dart - 从Dart过滤模糊CSS属性

javascript - 在 Web 上的 Firebase 中将电话号码与 Facebook 和 Gmail 帐户相关联

swift - "Missing required module"当 pod 库仅安装在一个 Target 中时

android - flutter 运行错误,并且gradle失败,退出代码为1

flutter - 如何在flutter中组织包内的dart文件

flutter - 返回类型 'Future<bool?> Function()' 不是闭包上下文所要求的 'Future<bool>'

dart - Flutter:使用全局流?