Flutter DropdownButton - 从rest webservice填充项目

问题描述 投票:1回答:2

我的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':不是真的。

如何正确选择项目?有什么想法有什么不对吗?

asynchronous combobox dart flutter
2个回答
0
投票

你不应该在这种情况下使用FutureBuilder。而是在initState()中获取数据,然后使用setState()进行重建以更新视图。

如果fetchCities()每次调用时都会创建一个新的Future,那么build()将在每次重建UI时调用该fetch(这可能经常发生)

https://docs.flutter.io/flutter/widgets/FutureBuilder-class.html

未来必须早先获得,例如在State.initState期间,......


0
投票

我今天遇到了同样的问题,经过一番挖掘后,我在代码中发现了一个错误:DropdownButton中的值不在项目列表中。

我假设(错误地)下拉列表将处理“空”值 - 但事实并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.