即使颤振中的坐标不同,用户之间的距离始终为 0?

Distance between users is always 0 even though coordinates are different in flutter?

我试图显示注册到应用程序并显示在 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.65036.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 个参数。

  • 简介[索引]
  • 指数
return DistanceCard(profile: profiles[index], index: index);

还好吗?

现在在 Distance Card 中,您正在使用 Provider 从此处的配置文件列表中获取完全相同的配置文件纬度和配置文件长度。

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

这里的“纬度”是什么? -> 配置文件[索引].location.latitude

还有一点? -> 配置文件[widget.index].location.latitude

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

我建议做一个固定的“anchor”坐标,比如用户的当前位置,或者任何一个用户的位置,然后找到相对位置.

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

你基本上是在使用同一个物体两次,所以它与它的距离是 0

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

然后在 _DistanceCardState(我建议您在构建方法之外创建这段代码)

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)),
            ),
          );
        });
  }
}