我正在尝试创建一个dropdownButtonFormField,其中包含来自sqflite数据库的对象值列表。我到了显示列表项的地步,但是当我单击其中一个时,它会大喊一个错误
class Test extends StatefulWidget {
@override
_TestState createState() => _TestState();
}
class _TestState extends State<Test> {
Section currentSection;
@override
Widget build(BuildContext context) {
final sectionsProvider = Provider.of<SectionsProvider>(context);
return Scaffold(
body: Container(
padding: EdgeInsets.all(15),
child: FutureBuilder<List<Section>>(
future: sectionsProvider.getSections(),
builder: (BuildContext context,AsyncSnapshot<List<Section>> snapshot){
if(!snapshot.hasData){
return Text('Loading...');
}else{
return DropdownButtonFormField<Section>(
//decoration: inputDecoration.copyWith(hintText: currentSection.title),
//value: currentSection,
items: snapshot.data.map((section){
return DropdownMenuItem<Section>(
value: section,
child: Row(
children: [
Icon(
Icons.brightness_1,
size: 15,
color: Color(section.color),
),
SizedBox(width: 20,),
Text(section.title),
],
),
);
},
).toList(),
isExpanded: false,
isDense: true,
onChanged: (value){
setState(() {
currentSection = value;
});
},
);
}
},
),
),
);
}
}
答案 0 :(得分:0)
DropdownButtonFormField缺少值参数,因为您遇到此错误。
在下面的行中取消注释将为您服务。
value: currentSection,
更新:
我认为问题在于您正在将整个对象分配给value参数,下拉菜单必须将值与下拉列表值进行比较以检查是否有新的分配值在下拉列表中可用。
但是,在flutter(dart)中,我们无法直接比较对象。您必须重写==运算符并使用hascode进行编码,但是我们可以使用Equatable包轻松进行比较。
我不认识您的Section类,所以像我在以下示例类中所做的那样进行更改。
首先,在pubspec.yaml文件中包含Equatable软件包。
class Section extends Equatable {
final int id;
Section({this.id});
@override
List<Object> get props => [id]; // pass all variable with(,) separated as i pass id.
}