firebase - 如何从列表元素中获取单个值

标签 firebase flutter dart google-cloud-firestore

我正在尝试将名为“data”的列表中的一个值写入 firestore,该列表有两个元素和两个值,mileage 和 geodistance。目前 firestore 正在将里程和地理距离写入 firestore,而实际上我只需要将里程写入 firestore。目前我正在使用 final mileager = data.elementAt(0);将元素放入 firestore,但是当我只需要元素中的单个值时,它会上传元素中的所有内容。如何从此列表中获取单个值并将其写入 firestore?基本上我使用地理定位器来查看哪个点最近,然后我想将该点的“里程”写入 firestore。下图显示了当前的里程数。这很接近,但我希望它只是一个字段和值,而不是 map 。

enter image description here

import 'dart:async';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:geolocator/geolocator.dart';
import 'package:intl/intl.dart';

final _firestore = FirebaseFirestore.instance;

class Geodistancer {
  final int? mileage;
  final double geodistance;

  const Geodistancer({
    required this.mileage,
    required this.geodistance,
  });
}

Future<Position> getLocation() async {
  var currentLocation;
  try {
    currentLocation = await Geolocator.getCurrentPosition(
        desiredAccuracy: LocationAccuracy.best);
  } catch (e) {
    currentLocation = null;
  }
  return currentLocation;
}

Future<void> backgroundUpdate() async {
  Firebase.initializeApp();
  FirebaseAuth auth = FirebaseAuth.instance;
  Position _fetchedUserLocation = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high);

  getLocation().then((position) async {
    _fetchedUserLocation = position;
    final distanceInMiles1 = Geolocator.distanceBetween(
        _fetchedUserLocation.latitude, _fetchedUserLocation.longitude,
        45.4906999, -122.49727);
    final distanceInMiles2 = Geolocator.distanceBetween(
        _fetchedUserLocation.latitude, _fetchedUserLocation.longitude, 45.48144,
        -122.50433);

    List<dynamic> data = [
      {"mileage": 1, "geodistance": distanceInMiles1},
      {"mileage": 2, "geodistance": distanceInMiles2},
    ];
    data.sort((a, b) => a["geodistance"].compareTo(b["geodistance"]));

    User firebaseUser = (auth.currentUser)!;
    String uid = firebaseUser.uid;
    DateTime dateTime = DateTime.now();
    String dateString = DateFormat().format(dateTime);
    double latitude = _fetchedUserLocation.latitude.toDouble();
    double longitude = _fetchedUserLocation.longitude.toDouble();
    final speedInMilesPerHour = _fetchedUserLocation.speed * 2.23694;
    final mileager = data.elementAt(0);

    _firestore
        .collection('locations')
        .add({
      'Uid': uid,
      'DateTime': dateString,
      'Mileage': mileager,
      'Speed': speedInMilesPerHour.round().toString() + ' MPH',
      'position': GeoPoint(latitude, longitude)
    });
  });
}

最佳答案

改成这样:

final mileager = data.elementAt(0)["mileage"];

因为之前,您正确获取了索引为 0 的元素,但该元素是一个 Map。您想要的是该元素中索引 0 处的键“里程”处的值。该元素应该作为单个字段而不是 map 发布到 firebase,您应该很好。

保持其余代码不变。

关于firebase - 如何从列表元素中获取单个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68639301/

相关文章:

flutter - 在列中生成选择筹码列表

android - Firebase runloop (3.0.0) 中的未捕获异常在我的生产 Android 应用程序中。请报告给 support@firebase.com

java - 从 firebase 获取坐标以绘制折线

Android Studio : App crashes after adding Firebase

Android 之类的 Flutter 中的文本字段验证?

dart - 如何让 AppBar 保持在屏幕顶部

java - 如何添加不同项目的数据?

file - 无法在 flutter 中加载资源

flutter - Flutter 中有 'BroadcastReciver' 吗?

flutter - 禁用 ListView 滚动