【问题标题】:Updating Dropdown Data In Flutter Gives Error在 Flutter 中更新下拉数据会出错
【发布时间】:2019-09-26 14:07:32
【问题描述】:

我正在开发一个由 Flutter 中的 dropdownbutton 组成的小部件。此小部件在向用户传入的 url 发出请求后创建 dropdownmenuitems

我已经看到正在进行调用并且响应有效,但是当我使用 setState 更新下拉列表的数据源时,我收到以下错误:

'package:flutter/src/material/dropdown.dart':断言失败:第 560 行 pos 15:'items == null || 我/颤振(11514):items.isEmpty ||值 == 空 || items.where((DropdownMenuItem item) => item.value == I/flutter (11514): value).length == 1': 不正确。

我尝试研究此错误,但没有找到有用的答案。代码如下:

class _MyWidgetState extends State<MyWidget> {

List<DropdownMenuItem<String>> _data = [];
String _selected = '';

@override
void initState() {
   super.initState();
   _loadData();
 }
 void _loadData() async {
    if (widget.urlToFetchData.isNotEmpty) {
      var response = await http.get(widget.urlToFetchData);
      if (response.statusCode == 200) {
         Map<String, dynamic> jsonResponse = convert.jsonDecode(response.body);
         jsonResponse.forEach((key, value){
           setState(() {
                  this._data.add(new DropdownMenuItem(
                                  child: new Text(value.toString()),
                                  value: value.toString(),
                             ));
           });
         });
      } else {
         print("Request failed with status: ${response.statusCode}.");
       }
    }
  }
}

@override
Widget build(BuildContext context) {
   if (_data.length == 0) {
      return new Container();
   } else {
        return Column(
            children: <Widget> [
                  new Text(
                    widget.dropdownLabelTitle
                 ),
                DropdownButton(
                     value: _selected,
                     items: _data,
                     hint: new Text(widget.defaultOptionText),
                     onChanged: (value) {
                        _selected = value;
                        widget.valueReturned(_selected);
                        setState(() {

                        });
                     }
                   )
                ],
              );
            }
       }
    }

现在,我完全知道在小部件的初始化时,下拉按钮中的 items 字段被初始化为一个空列表,但我认为通过在 http 调用完成时调用 setState 来更新值。

我尝试了不同的数据更新方法(通过创建本地列表,然后使用addAll 或仅通过赋值),但我得到了同样的错误。

有人知道如何解决这个问题吗?

【问题讨论】:

  • _selected 的初始值为' ',因此它必须存在具有该值的 DropDownMenuItem。你确定,你有吗?
  • 在下拉按钮项目列表更新时将null 传递给_selected

标签: asynchronous dart flutter widget dropdown


【解决方案1】:

您收到此错误是因为下拉菜单试图选择不存在的项目。

DropdownButton(
        value: _selected, # < here you are trying to select `String _selected = '';`
        items: _data,

要解决这个简单的问题,请删除 value 或将其设置在某处。

【讨论】:

  • 当我在解析 json 后删除 setState 语句时,我没有收到错误消息。为什么这会解决我的问题?首次执行构建方法时,selected 也是空的,我没有收到错误。
  • 如果_data_selected 为空,则不会出现任何错误。
  • @Nuts 将其设置为value 是什么意思。我们应该把value 准确地放在哪里。
【解决方案2】:

您的问题确实是由_selected 值引起的。它必须在DropdownMenuItem 的列表中,因此在您的情况下,第一个值是空字符串并且没有项目,所以没关系,但是当您从 API 获取值时,没有 DropdownMenuItem 具有 @ 987654324@ 所以解决方法是使用从 API 接收到的第一个值来初始化 _selected。你也应该在for 循环之外使用setState。像这样的:

setState(() {
      jsonResponse.forEach((key, value) {
        if (_selected.isEmpty) {
          _selected = value;
        }
        this._data.add(new DropdownMenuItem(
              child: new Text(value.toString()),
              value: value.toString(),
            ));
      });
    });

【讨论】:

    【解决方案3】:

    这将是可行的。您必须在数组和值中插入至少一个数据。

    List<DropdownMenuItem<String>> _data = ['Select One'];
    String _selected = _data[0];
    

    或者你可以这样做---->

    List<DropdownMenuItem<String>> _data = [];
    String _selected = '';
    _data.length > 0 ? DropdownButton(
                         value: _selected,
                         items: _data,
                         hint: new Text(widget.defaultOptionText),
                         onChanged: (value) {
                            _selected = value;
                            widget.valueReturned(_selected);
                            setState(() {
    
                            });
                         }
                       ) : Container();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-03
      • 2019-05-07
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多