我正在创建两个下拉菜单,条件是第二个下拉菜单中的值根据第一个下拉菜单中的选定值而变化。然而,我不断收到此错误,
LateInitializationError: Field 'selecItem' has not been initialized.
这是在我在第一个下拉菜单中选择值后发生的。
我不明白。有人可以给我解释一下吗?
late List<String> department;
late String? selectedDepartment;
late List<String> adminTitle;
late List<String> technicalTitle;
@override
void initState(){
super.initState();
department = [
widget.technicalDept,
widget.adminDept
];
selectedDepartment = department[0];
if (selectedDepartment == department[0]) {
selecItem = [
widget.selectTitleString,
widget.backEndDevString,
widget.frontEndDevString,
widget.networkEngString,
widget.computerEngString,
];
values = technicalTitle[0];
}
if (selectedDepartment == department[1]) {
selecItem = [
widget.selectTitleString,
widget.regionalAdminString,
widget.sectorAdminString
];
values = adminTitle[0];
}
}
**in the build widget**
Row( children: [
SizedBox(
width: screenWidth * 0.1,//I defined media query for this
child: Text("${widget.departmentString}:")),
DropdownButton<String>(
value: selectedDepartment,
items: department.map((e) {
return DropdownMenuItem(value: e, child: Text(e));
}).toList(),
onChanged: (value) {
setState(() {
selectedDepartment = value;
});
},
),
selectedDepartment != department[0]
? Row(
children: [
SizedBox(
width: screenWidth * 0.1,
child:
Text("${widget.selectTitleString}:")),
DropdownButton<String>(
value: values,
items: selecItem!.map((e) {
return DropdownMenuItem(
value: e, child: Text(e));
}).toList(),
onChanged: (value) {
setState(() {
values = value;
});
},
),
],
)
: const SizedBox()
],
),
您的代码由于未初始化的后期变量(selecItem)而失败 使 selecItem 可空并在 initState 和第一个下拉列表的 onChanged 回调中初始化它,以确保它始终在使用前设置
List<String>? selecItem;
这是样本
class MyWidget extends StatefulWidget {
final String technicalDept;
final String adminDept;
final String selectTitleString;
final String backEndDevString;
final String frontEndDevString;
final String networkEngString;
final String computerEngString;
final String regionalAdminString;
final String sectorAdminString;
final String departmentString;
const MyWidget({
Key? key,
required this.technicalDept,
required this.adminDept,
required this.selectTitleString,
required this.backEndDevString,
required this.frontEndDevString,
required this.networkEngString,
required this.computerEngString,
required this.regionalAdminString,
required this.sectorAdminString,
required this.departmentString,
}) : super(key: key);
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late List<String> department;
String? selectedDepartment;
List<String>? selecItem;
String? values;
@override
void initState() {
super.initState();
department = [widget.technicalDept, widget.adminDept];
selectedDepartment = department[0];
updateTitlesBasedOnDepartment();
}
void updateTitlesBasedOnDepartment() {
if (selectedDepartment == department[0]) {
selecItem = [
widget.selectTitleString,
widget.backEndDevString,
widget.frontEndDevString,
widget.networkEngString,
widget.computerEngString,
];
} else if (selectedDepartment == department[1]) {
selecItem = [
widget.selectTitleString,
widget.regionalAdminString,
widget.sectorAdminString,
];
}
values = selecItem?.first;
}
@override
Widget build(BuildContext context) {
final screenWidth = MediaQuery.of(context).size.width;
return Column(
children: [
Row(
children: [
SizedBox(width: screenWidth * 0.1, child: Text("${widget.departmentString}:")),
DropdownButton<String>(
value: selectedDepartment,
items: department.map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (value) {
setState(() {
selectedDepartment = value;
updateTitlesBasedOnDepartment();
});
},
),
],
),
if (selectedDepartment == department[0] || selectedDepartment == department[1])
Row(
children: [
SizedBox(width: screenWidth * 0.1, child: Text("${widget.selectTitleString}:")),
DropdownButton<String>(
value: values,
items: selecItem?.map((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (value) {
setState(() {
values = value;
});
},
),
],
)
],
);
}
}