错误:检测到零个或 2 个或更多 [DropdownMenuItem] 具有相同的值 I/flutter (18363): 'package:flutter/src/material/dropdown.dart':

Wei*_*Jun 19 flutter

错误代码 嗨,我是 flutter 新手,有一个关于 dropdownbutton 的问题,关于对多个 dropdownbutton 使用相同的值。

根据我对错误的理解,这是由于在同一活动中为 2 个或更多下拉按钮使用了相同的列表。

我怎样才能解决这个错误,但仍然能够为 2 个或更多下拉按钮重用列表?

  String _value1;
  String _value2;

  final List<String> nameList = <String>[
    "Name1",
    "Name2",
    "Name3",
    "Name4",
    "Name5",
    "Name6",
    "Name7",
    "Name8"
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        elevation: 2.0,
        title: Text('Hello'),
      ),
      body:  ListView(
            children: <Widget>[
              Row(
                children: <Widget>[
                  Text('Name: '),
                  Center(
                    child: DropdownButton(
                      value: _value1,
                      onChanged: (value) {
                        setState(() {
                          _value1 = value;
                        });
                      },
                      items: nameList.map(
                        (item) {
                          return DropdownMenuItem(
                            value: item,
                            child: new Text(item),
                          );
                        },
                      ).toList(),
                    ),
                  ),
                ],
              ),
              Row(
                children: <Widget>[
                  Text('Name: '),
                  Center(
                    child: DropdownButton(
                      value: _value2,
                      onChanged: (value) {
                        setState(() {
                          _value2 = value;
                        });
                      },
                      items: nameList.map(
                        (item) {
                          return DropdownMenuItem(
                            value: item,
                            child: new Text(item),
                          );
                        },
                      ).toList(),
                    ),
                  ),
                ],
              ),
            ],
          ),
      backgroundColor: Colors.grey[200],
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*d_E 39

我有完全相同的错误,多个下拉列表都来自同一个静态列表,唯一的区别是在我的情况下,它是一个对象列表,而不是字符串。

所以,如果它是一个静态列表,它不可能是空的,列表中没有重复的值,而且你已经确定value不为空?那么剩下的唯一选择就是item.value就是与value

在我的情况,因为它是一个对象列表,我不得不重写operator ==hashcode方法,在我的对象类。

bool operator ==(dynamic other) =>
      other != null && other is TimeSelection && this.hour == other.hour;

  @override
  int get hashCode => super.hashCode;
Run Code Online (Sandbox Code Playgroud)

就是这样。我不必初始化_value1_value2

  • 这应该被标记为已接受的答案。添加 equal 和 hashCode 函数为我解决了这个问题。我将一个对象从一个页面传递到另一个页面,碰巧传递到新页面的对象的实例与从新页面中的列表创建的对象不同,即使它们都是由相同的数据构造的。 (2认同)
  • @MonstersX 您能否分享一下如何将 override === 和 hashcode 添加到自定义对象中的代码 (2认同)

小智 24

您收到该异常是因为 _value1 和 _value2 未初始化并向下拉小部件提供空。

你可以这样做:

DropdownButton(
  value: _value1.isNotEmpty ? _value1 : null, // guard it with null if empty
  items: nameList.map((item) {
           return DropdownMenuItem(
              value: item,
              child: new Text(item),
           );
         }).toList(), 
);
Run Code Online (Sandbox Code Playgroud)


小智 8

你有这个例外是因为错误:

  1. 没有_value1_value2初始化。
  2. 当你初始化它们确保_value1_value2直接从nameList
_value1 = nameList[0];
_value2 = nameList[3];
Run Code Online (Sandbox Code Playgroud)

这是复杂数据类型的重要步骤,但在您的情况下

_value1 = "Name1";
_value2 = "Name4";
Run Code Online (Sandbox Code Playgroud)

就足够了。

完整示例:

  String _value1;
  String _value2;

  final List<String> nameList = <String>[
    "Name1",
    "Name2",
    "Name3",
    "Name4",
    "Name5",
    "Name6",
    "Name7",
    "Name8"
  ];

  /// initialization is here:
  @override
 void initState() {
    super.initState();
    _value1 = nameList[0];
    _value2 = nameList[3];
  }

  @override
  Widget build(BuildContext context) {
    return ListView(
      children: <Widget>[
        Row(
          children: <Widget>[
            Text('Name: '),
            Center(
              child: DropdownButton(
                value: _value1,
                onChanged: (value) {
                  setState(() {
                    _value1 = value;
                  });
                },
                items: nameList.map(
                  (item) {
                    return DropdownMenuItem(
                      value: item,
                      child: new Text(item),
                    );
                  },
                ).toList(),
              ),
            ),
          ],
        ),
        Row(
          children: <Widget>[
            Text('Name: '),
            Center(
              child: DropdownButton(
                value: _value2,
                onChanged: (value) {
                  setState(() {
                    _value2 = value;
                  });
                },
                items: nameList.map(
                  (item) {
                    return DropdownMenuItem(
                      value: item,
                      child: new Text(item),
                    );
                  },
                ).toList(),
              ),
            ),
          ],
        ),
      ],
    );
  }
}
Run Code Online (Sandbox Code Playgroud)


Anu*_*ngh 7

您必须初始化_value1_value2并确保这些值也存在于 中nameList


vb1*_*b10 6

我有同样的问题,我解决了。下拉按钮需要项目列表和值。我们定义了items 和selected items,但是item selected 实例不在items 列表中。

你应该试试这个并修复你的逻辑。(value ? s 为用户选择的项目值)

 var _value = itemList.isEmpty
    ? value
    : itemList.firstWhere((item) => item.value == value.value);
Run Code Online (Sandbox Code Playgroud)

更多:https : //gist.github.com/VB10/fd560694fec0a38751e798a213408001


小智 5

我的解决方案比其他解决方案更简单。事实上,找到一个与列表中不同的值,是因为我在变量中放入了一个,该值既不是满的也不是空的,该值是这个(“”)并且它必须Dropdown 值实例为null 所以,我只是在变量声明中放置了一个值 null 。就像:“String _value;”,瞧,它成功了。

#对不起,这里有英语、巴西语。