在 Flutter 中更新下拉数据会出错

Posted

技术标签:

【中文标题】在 Flutter 中更新下拉数据会出错【英文标题】:Updating Dropdown Data In Flutter Gives Error 【发布时间】: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 【参考方案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();

【讨论】:

以上是关于在 Flutter 中更新下拉数据会出错的主要内容,如果未能解决你的问题,请参考以下文章

flutter练手项目-玩Android

Flutter 2020春季更新,你还不来看看?是不是又变了!

flutte学习-编译模式

flutte学习-编译模式

Flutte VS RN

flutter SharedPreferences数据存储