Flutter 错误:检测到零个或2个或多个[DropdownMenuItem]具有相同的值I/颤振(18363):&x27;包装:颤振/src/material/dropdown.dart';:
嗨,我是新来的颤振,有一个关于dropdownbutton的问题,关于对多个dropdownbutton使用相同的值 从我对错误的理解来看,这是由于在同一活动中对2个或更多下拉按钮使用了相同的列表 我如何才能解决此错误,但仍然能够为2个或更多下拉按钮重用列表Flutter 错误:检测到零个或2个或多个[DropdownMenuItem]具有相同的值I/颤振(18363):&x27;包装:颤振/src/material/dropdown.dart';:,flutter,Flutter,嗨,我是新来的颤振,有一个关于dropdownbutton的问题,关于对多个dropdownbutton使用相同的值 从我对错误的理解来看,这是由于在同一活动中对2个或更多下拉按钮使用了相同的列表 我如何才能解决此错误,但仍然能够为2个或更多下拉按钮重用列表 String _value1; String _value2; final List<String> nameList = <String>[ "Name1", "Name2",
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],
);
}
}
字符串_值1;
字符串_值2;
最终列表名称列表=[
“名称1”,
“名称2”,
“名称3”,
“名称4”,
“名称5”,
“名称6”,
“姓名7”,
“姓名8”
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标高:2.0,
标题:Text('Hello'),
),
正文:ListView(
儿童:[
划船(
儿童:[
文本('名称:'),
居中(
孩子:下拉按钮(
值:_值1,
一旦更改:(值){
设置状态(){
_value1=值;
});
},
项目:nameList.map(
(项目){
返回下拉菜单项(
价值:项目,,
子项:新文本(项目),
);
},
).toList(),
),
),
],
),
划船(
儿童:[
文本('名称:'),
居中(
孩子:下拉按钮(
值:_值2,
一旦更改:(值){
设置状态(){
_value2=值;
});
},
项目:nameList.map(
(项目){
返回下拉菜单项(
价值:项目,,
子项:新文本(项目),
);
},
).toList(),
),
),
],
),
],
),
背景颜色:颜色。灰色[200],
);
}
}
您可以在多个下拉按钮中使用相同的列表。您得到的错误是因为列表中有多个相同的值。
例如,如果我将列表更改为下面给定的,其中有两个项目具有相同的值,它将抛出一个错误
`final List<String> nameList = <String>[
"Name1",
"Name1",
"Name3",
"Name4",
"Name5",
"Name6",
"Name7",
"Name8"
];`
`最终列表名称列表=[
“名称1”,
“名称1”,
“名称3”,
“名称4”,
“名称5”,
“名称6”,
“姓名7”,
“姓名8”
];`
错误:
您必须用初始值初始化\u值1
和\u值2
。我遇到了同样的问题,我解决了它。
下拉按钮需要项目列表和值。我们定义了项和选定项,但选定项实例不在项列表中
你应该试试这个,修正你的逻辑。
(值ı为用户选择的项目值)
更多信息:\u value1
和\u value2
变量需要初始化,或者您可以执行以下操作:
value: _value1 != null ? _value1 : null,
hint: Text('Your hint'),
您得到该异常是因为_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(),
);
您必须初始化\u值1
和\u值2
,并确保这些值也存在于名称列表中 我有完全相同的错误,多个下拉列表都来自同一个静态列表,唯一的区别是,在我的例子中,它是一个对象列表,而不是字符串
所以,如果它是一个静态列表,那么它不可能是空的,列表中没有重复的值,并且您已经确保value
不是空的?然后剩下的唯一选项是项。值
不同于值
在我的例子中,由于它是一个对象列表,我必须覆盖对象类中的operator==
和hashcode
方法
bool operator ==(dynamic other) =>
other != null && other is TimeSelection && this.hour == other.hour;
@override
int get hashCode => super.hashCode;
就这样。我不必初始化\u值1
或\u值2
此异常是由于错误导致的:
无\u值1
和\u值2
初始化
初始化它们时,请确保名称列表中的\u值1
和\u值2
正确,例如
对于复杂的数据类型,这是重要的一步,但在您的情况下
_value1 = "Name1";
_value2 = "Name4";
这就足够了
完整示例:
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(),
),
),
],
),
],
);
}
}
字符串_值1;
字符串_值2;
最终列表名称列表=[
“名称1”,
“名称2”,
“名称3”,
“名称4”,
“名称5”,
“名称6”,
“姓名7”,
“姓名8”
];
///初始化如下:
@凌驾
void initState(){
super.initState();
_value1=名称列表[0];
_value2=名称列表[3];
}
@凌驾
小部件构建(构建上下文){
返回列表视图(
儿童:[
划船(
儿童:[
文本('名称:'),
居中(
孩子:下拉按钮(
值:_值1,
一旦更改:(值){
设置状态(){
_value1=值;
});
},
项目:nameList.map(
(项目){
返回下拉菜单项(
价值:项目,,
子项:新文本(项目),
);
},
).toList(),
),
),
],
),
划船(
儿童:[
文本('名称:'),
居中(
孩子:下拉按钮(
值:_值2,
_value1 = "Name1";
_value2 = "Name4";
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(),
),
),
],
),
],
);
}
}
value: _value1,
onChanged: (value) {
setState(() {
_value1 = value;
_value2 = null;
});
},