asynchronous - Flutter DropdownButton - 从 rest webservice 填充项目

标签 asynchronous combobox dart flutter

我的 fetchCities()方法返回 Future<List<City>>它从 rest web 服务加载数据。填充项目的代码:

 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): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════ I/flutter (13910): The following assertion was thrown building FutureBuilder>(dirty, state: I/flutter (13910): _FutureBuilderState>#dacd9): I/flutter (13910): 'package:flutter/src/material/dropdown.dart': Failed assertion: line 560 pos 15: 'items == null || I/flutter (13910): items.isEmpty || value == null || items.where((DropdownMenuItem item) => item.value == I/flutter (13910): value).length == 1': is not true.

如何正确选择项目?有什么问题吗?

最佳答案

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

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

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

The future must have been obtained earlier, e.g. during State.initState, ...

关于asynchronous - Flutter DropdownButton - 从 rest webservice 填充项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55003037/

相关文章:

c# - 如何在 C# 中管理混合的同步和异步进程?

javascript - Node.js 架构和性能

javascript - Ext Js 2.1 组合框 Anymatch 过滤器不起作用

Flutter Dart Dio Get Request 太慢了

python - 如何使用 gRPC 进行异步流式处理?

c# - 在 for 中使用 await Task.Delay 会降低性能

c# - 为什么一路往下用Async/await

wpf - 如何将 "list"字符串绑定(bind)到 WPF 中的 ComboBox?

java - Vaadin - 添加组件作为另一个组件的元素

flutter |如何验证时间选择器