我的自定义下拉小部件在尝试使用模型实例设置初始值时会抛出错误。
我的自定义下拉小部件在尝试使用模型实例设置初始值时会抛出错误。
我创建了以下自定义下拉菜单小部件。
class CustomDropdown extends StatefulWidget {
final Color? textColor;
final Color? backgroundColor;
final Color? iconColor;
final bool? boldText;
final Object? initialValue;
final List
final Function(Object?) onItemSelect;
const CustomDropdown({
Key? key,
this.textColor,
this.backgroundColor,
this.boldText,
this.iconColor,
required this.initialValue,
required this.itemList,
required this.onItemSelect,
}) : super(key: key);
@override
_CustomDropdownState createState() => _CustomDropdownState();
}
class _CustomDropdownState extends State
late Object? _dropdownValue;
late bool _boldText;
@override
void initState() {
super.initState();
_dropdownValue = widget.initialValue;
_boldText = widget.boldText ?? false;
}
@override
Widget build(BuildContext context) {
return SizedBox(
height: 20,
child: DropdownButtonHideUnderline(
child: DropdownButton
value: _dropdownValue,
icon: Icon(
Icons.expand_more_outlined,
color: widget.iconColor ?? (widget.textColor ?? Colors.black),
),
dropdownColor: widget.backgroundColor ?? Colors.white,
style: TextStyle(
color: widget.textColor ?? Colors.black,
fontWeight: _boldText ? FontWeight.bold : FontWeight.normal,
),
items: widget.itemList,
onChanged: (value) {
setState(() => _dropdownValue = value);
widget.onItemSelect(value);
},
),
),
);
}
}
然后我在另一个独立的Dart文件中实例化了上述创建的小部件,如下所示,
class CurrencyDropdown extends StatelessWidget {
const CurrencyDropdown({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Center(
child: CustomDropdown(
initialValue: Currency(id: 1, displayText: 'USD'), <------------ 此行报错
boldText: true,
iconColor: ColorData.disabledTextColor,
itemList: [
DropdownMenuItem(
child: Text('USD'),
value: Currency(id: 1, displayText: 'USD'),
),
DropdownMenuItem(
child: Text('LKR'),
value: Currency(id: 2, displayText: 'LKR'),
),
],
onItemSelect: (_) {},
),
);
}
}
在上面的代码中,如果我用null
替换我指出的值,一切都正常。然而,如果我提供上述代码片段中显示的值,它会抛出一个错误。
错误信息如下所示,
在[DropdownButton]的值中应该正好有一个项目: { id: 1, displayText: USD }。
检测到与此值相同的0个、2个或更多[DropdownMenuItem]
'package:flutter/src/material/dropdown.dart'
此外,它显示了以下代码片段,
断言失败:第915行第15个位置:
'items == null || items.isEmpty || value == null ||
items.where((DropdownMenuItem
return item.value == value;
}).length == 1'
我还看到了下面的Stack Overflow帖子,但没有找到解决方法,
- Flutter Stateful Widgets and Generics
- How to implement a dropdown list in flutter?
- Flutter dropdown fails when class is provided instead of a string as
value
有人可以帮帮我吗?非常感谢!
问题的出现原因是initialValue
的值没有在itemList
中找到匹配的值。
解决方法是确保initialValue
的值在itemList
中存在。
以下是修改后的代码示例:
class CurrencyDropdown extends StatelessWidget {
CurrencyDropdown({Key? key}) : super(key: key);
List<Currency> list = [
Currency(id: 1, displayText: 'USD'),
Currency(id: 2, displayText: 'LKR'),
];
Widget build(BuildContext context) {
Currency initialValue = list.isNotEmpty ? list[0] : null; // 添加了一个判断,如果list不为空,则将第一个元素作为初始值,否则将初始值设为null
return Center(
child: CustomDropdown(
initialValue: initialValue,
boldText: true,
iconColor: Colors.grey,
itemList: list
.map(
(e) => DropdownMenuItem(
child: Text(e.displayText),
value: e,
),
)
.toList(),
onItemSelect: (_) {},
),
);
}
}
请尝试使用修改后的代码,看看是否能够解决问题。如果问题仍然存在,请检查initialValue
的值是否正确并确保在itemList
中存在匹配的值。