Flutter DropdownButton - 从休息网络服务填充项目

use*_*216 6 combobox asynchronous dart flutter

我的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();
              }
            }

        )

    );
  }
Run Code Online (Sandbox Code Playgroud)

结果:项目在选择器中正确显示。但是,在选择任何特定项目时,我遇到了异常:

我/扑(13910):???小部件库捕获的异常 ????????????????????????????????????????????? ??????????????? I/flutter (13910): 以下断言被抛出 building FutureBuilder>(dirty, state: I/flutter (13910): _FutureBuilderState>#dacd9): I/flutter (13910): 'package:flutter/src/material/dropdown .dart':断言失败:第 560 行 pos 15:'items == null || I/flutter (13910): items.isEmpty || 值 == 空 || items.where((DropdownMenuItem item) => item.value == I/flutter (13910): value).length == 1': 不是真的。

如何正确选择商品?任何想法有什么问题?

Gün*_*uer 5

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

如果每次调用时都fetchCities()创建一个新的Future,那么build()每次重建 UI 时都会调用该获取(这可能很频繁)

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

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