我有代表当前所选项目的此类:
class DropdownText with ChangeNotifier {
String _text = "";
String get text => _text;
void setText(String value) {
_text = value;
notifyListeners();
}
}
这是我用来尝试显示下拉按钮的代码:
class DropDown extends StatelessWidget {
final List<DropdownMenuItem<String>> menu = [
DropdownMenuItem<String>(
value: "A",
child: Text("A"),
),
DropdownMenuItem<String>(
value: "B",
child: Text("B"),
)
];
DropDown();
@override
Widget build(BuildContext context) {
return FormField<String>(
builder: (FormFieldState<String> formState) {
return Consumer<DropdownText>(
builder: (context, dropdown, _) {
return InputDecorator(
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10)
),
prefixIcon: const Icon(Icons.fastfood),
),
child: DropdownButtonFormField<String>(
items: menu,
onChanged: (value) {
dropdown.setText(value);
},
value: dropdown.text,
),
);
},
);
},
);
}
}
我得到的错误是
断言失败:第1411行第15行:'item == null || items.isEmpty || 值== null || I /颤振(7719):
items.where(((DropdownMenuItem item){I / flutter(7719):
返回item.value == value; I /颤振(7719):} .length == 1'
但是我在哪里失败?我明确地将每个泛型类型。可能是提供程序包中的Consumer<T>
问题吗?
我还没有在下拉菜单中看到重复项和空项目。
答案 0 :(得分:1)
阅读错误的这一部分
items.where((DropdownMenuItem<T> item) {return item.value == value;}).length == 1'
您会注意到,如果长度为0,则仍会标记错误
基本上,下拉列表的初始值必须为一个DropDownItem。而且因为您的初始值为“”,并且没有以“”作为其值的DropDownItem,所以它将不起作用
String _text = "";
解决方案
在DropDownText中将 _text 的初始值设置为项目的第一个值(DropDownItems)
class DropdownText with ChangeNotifier {
String _text = "A";
String get text => _text;
void setText(String value) {
_text = value;
notifyListeners();
}
}
答案 1 :(得分:0)
如果分配的当前值不是来自值列表,我们可能会得到此类型错误,以修复交叉检查当前值,如果它不同,分配默认空值将保存中断代码,
例如:currentValue: (apiDataValue.value?.isEmpty??true)?null:apiDataValue.value,