我正在尝试显示已注册应用并显示在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 。谁能指出我哪里出问题了?
答案 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)),
),
);
});
}
}