Flutter 从 Sqflite 中获取 DropdownButtonFormField 列表项 - 错误 0 或 2 个值
Flutter fetching DropdownButtonFormField list items from Sqflite - Error 0 or 2 values
我正在尝试创建一个 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;
});
},
);
}
},
),
),
);
}
}
DropdownButtonFormField 缺少值参数,因为您收到此错误。
取消评论以下行对您有用。
value: currentSection,
更新:
我认为问题在于您正在将整个对象分配给值参数,下拉列表必须将值与下拉列表值进行比较以检查下拉项列表中是否有新的分配值。
但是在flutter(dart)中,我们不能直接比较object。你必须覆盖 == 运算符和 hascode ,但我们可以使用 Equatable 包来轻松比较。
我不认识 class 部分,所以请按照我在以下示例 class 中所做的更改进行更改。
首先,在 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.
}
我正在尝试创建一个 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;
});
},
);
}
},
),
),
);
}
}
DropdownButtonFormField 缺少值参数,因为您收到此错误。
取消评论以下行对您有用。
value: currentSection,
更新:
我认为问题在于您正在将整个对象分配给值参数,下拉列表必须将值与下拉列表值进行比较以检查下拉项列表中是否有新的分配值。
但是在flutter(dart)中,我们不能直接比较object。你必须覆盖 == 运算符和 hascode ,但我们可以使用 Equatable 包来轻松比较。
我不认识 class 部分,所以请按照我在以下示例 class 中所做的更改进行更改。
首先,在 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.
}