我的fetchCities()
方法返回Future<List<City>>
,它从rest webservice加载数据。填充项目的代码:
Widget buildCitiesSelector(){
return new Center(
child: FutureBuilder(
future: fetchCities() ,
builder: (context, snapshot){
if (snapshot.hasData) {
return new DropdownButton <City>(
hint: Text('Wybierz miasto'),
items: snapshot.data.map<DropdownMenuItem<City>>((City value) {
return DropdownMenuItem<City>(
value: value,
child: Text(value.name),
);
}).toList(),
onChanged: (value) {
setState(() {_selectedCity = value;});
},
value: _selectedCity,
);
}
else{
return CircularProgressIndicator();
}
}
)
);
}
结果:项目在选择器中正确显示。但是,在选择任何特定项目时,我会遇到异常:
I / flutter(13910):══╡WIDGETS LIBRARY的例外情况╞═════════════════════════════════════════════════════════════════════════════════════════════════════ ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ ):_ _FutureBuilderState>#dacd9):I / flutter(13910):'package:flutter / src / material / dropdown.dart':断言失败:第560行pos 15:'items == null || I / flutter(13910):items.isEmpty || value == null || items.where((DropdownMenuItem item)=> item.value == I / flutter(13910):value)。length == 1':不是真的。
如何正确选择项目?有什么想法有什么不对吗?
你不应该在这种情况下使用FutureBuilder
。而是在initState()
中获取数据,然后使用setState()
进行重建以更新视图。
如果fetchCities()
每次调用时都会创建一个新的Future
,那么build()
将在每次重建UI时调用该fetch(这可能经常发生)
https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html
未来必须早先获得,例如在State.initState期间,......
我今天遇到了同样的问题,经过一番挖掘后,我在代码中发现了一个错误:DropdownButton中的值不在项目列表中。
我假设(错误地)下拉列表将处理“空”值 - 但事实并非如此。