flutter - 无法使用下拉按钮和未来颤振更新数组
问题描述
我正在使用下拉按钮来更新用户周围的餐馆位置,但是这些位置没有在 ListView 中更新。这是我到目前为止所拥有的:
编辑:添加了初始化语句
初始化语句
@override
void initState() {
_dropDownMenuItems = buildAndGetDropDownMenuItems(changeDistance);
_mapDropdownFilter = _dropDownMenuItems[0].value;
filterMarker(userLat, userLong, dispensaries, 1);
super.initState();
}
我设置了一个类来帮助解决这个所谓的位置
class Locations{
final Restaurant dis;
final double dist;
final int index;
Locations({this.dis, this.dist, this.index});
}
然后调用此过滤器按距离对我的位置进行排序,并为他们提供与用户的距离(以英里为单位):
Future filterMarker(userLat, userLong, restaurants, filterdis) async {
Set<Marker> _tmpMarkers = Set();
final Uint8List markerIcon =
await getBytesFromAsset('assets/smiley.png', 100);
int filterCounter = 0;
List<Locations> _tmpLocation = List();
for (int i = 0; i < restaurant.length; ++i) {
Geolocator()
.distanceBetween(
userLat, userLong, restaurants[i].lat, restaurants[i].long)
.then((calcDist) {
print(calcDist);
if (calcDist / 1000 < filterdis) {
filterCounter++;
final String markerIdVal = 'marker_id_$filterCounter';
final MarkerId markerId = MarkerId(markerIdVal);
var dis = calcDist / 1000;
var distances = dis.toStringAsFixed(2);
// creating a new MARKER
_tmpMarkers.add(Marker(
markerId: markerId,
position: LatLng(restaurants[i].lat, restaurants[i].long),
infoWindow: InfoWindow(
title: restaurants[i].name, snippet: '$distances mi Away'),
icon: BitmapDescriptor.fromBytes(markerIcon)));
_tmpLocation.add(
Locations(index: i, dis: restaurants[i], dist: calcDist / 1000));
}
});
setState(() {
_filteredMarkers = _tmpMarkers;
filteredVenues = _tmpLocation.cast<Locations>();
});
print('Do once');
}
print('There are ${filteredVenues.length} _filteredMarkers');
}
我的下拉按钮按钮设置如下:
DropdownButton(
style: TextStyle(
fontFamily: 'Roboto-Regular',
color: Colors.black),
elevation: 6,
icon: Icon(
FontAwesomeIcons.angleRight,
color: buddiesGreen,
),
value: _mapDropdownFilter,
items: _dropDownMenuItems,
onChanged: _changeFilterList,
)
充满了这个:
//Distance Map filter Button
final List changeDistance = ['1', '5 ', '10 ', '20'];
// Set<Marker> _filteredMarkers = Set();
List<Locations> filteredVenues;
var _filteredMarkers;
var filteredRestaurant;
_dropDownMenuItems = buildAndGetDropDownMenuItems(changeDistance);
_mapDropdownFilter = _dropDownMenuItems[0].value;
String _mapDropdownFilter;
List<DropdownMenuItem<String>> _dropDownMenuItems;
List<DropdownMenuItem<String>> buildAndGetDropDownMenuItems(List tempList) {
List<DropdownMenuItem<String>> items = List();
for (String x in tempList) {
items.add(DropdownMenuItem(
value: x,
child: Text(
x,
style: TextStyle(
fontSize: 14,
fontFamily: 'Roboto-Regular',
fontWeight: FontWeight.w700,
color: buddiesPurple),
)));
}
return items;
}
void _changeFilterList(String value) {
//use _filterDropdown for switch statement
setState(() {
_mapDropdownFilter = value;
});
_sortProductsDropDown(_mapDropdownFilter);
print(_mapDropdownFilter);
}
void _sortProductsDropDown(_mapDropdownFilter) {
switch (_mapDropdownFilter) {
case '1 Mile':
print('1 Mile');
filterMarker(userLat, userLong, restaurant, 1);
print(restaurant.length);
break;
case '5 Miles':
filterMarker(userLat, userLong, restaurant, 5);
print(restaurant.length);
break;
case '10 Miles':
filterMarker(userLat, userLong, restaurant, 10);
print(restaurant.length);
break;
case '20 Miles':
filterMarker(userLat, userLong, restaurant, 20);
print(restaurant.length);
break;
}
}
当我点击断开连接的下拉菜单时它不会更新,为什么当用户选择不同的距离时它不会更新。
解决方案
因为您没有在 initState() 中使用 setState() 来获取位置列表。因此,即使您正确获取所有内容,位置的状态也不会更新。
..
setState(){
_dropDownMenuItems = buildAndGetDropDownMenuItems(changeDistance);
..
}
做这样的事情。
推荐阅读
- xaml - 如何将 ContentView 中的 CommandParameter 绑定到 Xamarin Forms 中父 ContentPage 中的元素
- mysql - MYSQL:带有索引虚拟列的 JSON VS 普通列和规范化
- ios - 带条纹的 ApplePay 中的地址无效
- r - R函数找到合适的值来拟合常数
- azure-active-directory - Terraform 提供商 Azure - 如何管理身份和访问管理 (Azure AD)?
- c# - 您有什么想法可以避免以下错误消息吗?
- shopify - 如何在 shopify 主题文件中获得总基数
- javascript - 如何一一提取数组的数字/数字(循环外)而不是另一个数组(原始数字)?Javascript
- reactjs - 表单写作测试(包括useState)
- angular - 刷新通过 firebase google 身份验证收到的 Google Id_token