即使坐标在抖动中也不同,用户之间的距离始终为0?

时间:2020-07-13 13:25:34

标签: firebase flutter dart flutter-listview

我正在尝试显示已注册应用并显示在Listview中的多个用户之间的距离,而Listview的代码如下:-

class DistanceListView extends StatefulWidget {
  @override
  _DistanceListViewState createState() => _DistanceListViewState();
}

class _DistanceListViewState extends State<DistanceListView> {
  @override
  Widget build(BuildContext context) {
    final profiles = Provider.of<List<ProfileData>>(context) ?? [];
    return ListView.builder(
        itemCount: profiles.length,
        itemBuilder: (context, index) {
          return DistanceCard(profile: profiles[index], index: index);
        });
  }
}

profiles是一个列表,其中包含用户位置的所有位置。现在,我创建了两个虚拟用户,其坐标分别为 35.6762、139.6503 6.9271、79.8612

DistanceCard的代码如下:-

class DistanceCard extends StatefulWidget {
  final int index;
  final ProfileData profile;
  DistanceCard({this.index, this.profile});
  @override
  _DistanceCardState createState() => _DistanceCardState();
}

class _DistanceCardState extends State<DistanceCard> {
  @override
  Widget build(BuildContext context) {
    final profiles = Provider.of<List<ProfileData>>(context) ?? [];
    final longitude = widget.profile.location.longitude;
    final latitude = widget.profile.location.latitude;
    var distance;

    futureconvert() async {
      distance = await Geolocator().distanceBetween(
          longitude,
          latitude,
          profiles[widget.index].location.longitude,
          profiles[widget.index].location.latitude);
      return distance;
    }

    return FutureBuilder(
        future: futureconvert(),
        builder: (context, snapshot) {
          return Card(
            child: Center(
              child: Padding(padding: EdgeInsets.all(5),
               child: Text(distance)),
            ),
          );
        });
  }
}

这是问题所在,当呈现窗口小部件时,distance始终显示为 0.0 。谁能指出我哪里出问题了?

2 个答案:

答案 0 :(得分:1)

好的,首先让我指出您正在犯的错误

您正在尝试查找相同坐标之间的距离,

让我解释一下。

您要将2个参数传递给距离卡。

  • 个人资料[索引]
  • 索引
return DistanceCard(profile: profiles[index], index: index);

好吗?

现在,在距离卡中,您正在使用提供者从此处的配置文件列表中获取完全相同的配置文件纬度和配置文件。

 distance = await Geolocator().distanceBetween(
          longitude,
          latitude,
          profiles[widget.index].location.longitude,
          profiles[widget.index].location.latitude);
      return distance;
    }

这里的“纬度”是什么? ->个人资料[index] .location.latitude

还有另一点? ->个人资料[widget.index] .location.latitude

由于索引相同,因此您正在获取完全相同的对象,因此 0.0 是距离。

我建议制作一个固定的“ ”坐标,例如用户的当前位置或任何一个用户的位置,然后找到相对位置。

让我知道这是否可以解决您的错误。

答案 1 :(得分:0)

您基本上使用了两次相同的对象,因此距其自身的距离为0

return DistanceCard(profile: profiles[index], index: index)
// You're passing the profile, let's say at index 0 of your list

然后在_DistanceCardState中(建议您在build方法之外创建此代码)

final profiles = Provider.of<List<ProfileData>>(context) ?? []; //This is the Provider that has the same list you used to build the DistanceCard
final longitude = widget.profile.location.longitude; //The longitude of the profile at index 0
final latitude = widget.profile.location.latitude; //The latitude of the profile at index 0
var distance;

futureconvert() async {
  distance = await Geolocator().distanceBetween(
      longitude,
      latitude,
      profiles[widget.index].location.longitude, //this and longitude refers to the same value (index 0 for the first one)
      profiles[widget.index].location.latitude); //this and latitude refers to the same value (index 0 for the first one)
  return distance;
}

在遍历列表时依此类推。因此,问题是您想与谁进行精确比较吗?列表中的所有其他Profiles吗?列表中的下一个?

class _DistanceCardState extends State<DistanceCard> {
  List<ProfileData> profiles;
  var distance;

  @override
  didChangeDependencies(){
    super.didchangeDependencies();
    profiles = Provider.of<List<ProfileData>>(context) ?? [];
  }

    futureconvert() async {
      int anotherIndex = 0;
      if(profiles.length != widget.index) anotherIndex = widget.index + 1;
      //This will compare it to the next profile in the list
      distance = await Geolocator().distanceBetween(
          widget.profile.location.longitude,
          widget.profile.location.latitude,
          profiles[anotherIndex].location.longitude, //Give another longitude
          profiles[anotherIndex].location.latitude); //Give another latitude
      return distance;
    }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder(
        future: futureconvert(),
        builder: (context, snapshot) {
          return Card(
            child: Center(
              child: Padding(padding: EdgeInsets.all(5),
               child: Text(distance)),
            ),
          );
        });
  }
}