我的自定义下拉小部件在尝试使用模型实例设置初始值时会抛出错误。

7 浏览
0 Comments

我的自定义下拉小部件在尝试使用模型实例设置初始值时会抛出错误。

我创建了以下自定义下拉菜单小部件。

class CustomDropdown extends StatefulWidget {

final Color? textColor;

final Color? backgroundColor;

final Color? iconColor;

final bool? boldText;

final Object? initialValue;

final List> itemList;

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 item) {

return item.value == value;

}).length == 1'

我还看到了下面的Stack Overflow帖子,但没有找到解决方法,

有人可以帮帮我吗?非常感谢!

0
0 Comments

问题的出现原因是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中存在匹配的值。

0