Flutter DropDownMenu 按钮更新现有记录
Flutter DropDownMenu Button update an existing record
我一直在试验我的 flutter 下拉按钮。
我正在做的事情的背景。
我有一个应用程序可以创建工作并将其提供给可用的员工。我已将所有员工存储在菜单按钮的列表中。我将在下面放置代码以显示工作单下拉按钮的创建。 selectedTech 位于程序的顶部,所以这不是问题
String selectedTech = "";
Container(
// margin: EdgeInsets.only(right: 20),
width: MediaQuery.of(context).size.width / 2.5,
child: DropdownButton(
hint: Text(
selectedTech,
style: TextStyle(color: Colors.blue),
),
isExpanded: true,
iconSize: 30.0,
style: TextStyle(color: Colors.blue),
items: listStaffUsers.map(
(val) {
return DropdownMenuItem<String>(
value: val,
child: Text(val),
);
},
).toList(),
onChanged: (val) {
setState(
() {
selectedTech = val.toString();
},
);
},
),
),
以上代码完美运行。
但是,当我想更新工作单以更改可用的工作人员时,我想将下拉菜单的初始值设置为分配给该工作的工作人员,因为并不总是保证他们会更改分配的工作人员到工作。当我将所选值设置为我的初始值时,我被该值锁定并且无法更改它。
这是我用来更新工作人员的代码。
String selectedTech = "";
int the build method I add
selectedTech = widget.staff;
Container(
// margin: EdgeInsets.only(right: 20),
width: MediaQuery.of(context).size.width / 2.5,
child: DropdownButton(
hint: Text(
selectedTech,
style: TextStyle(color: Colors.blue),
),
isExpanded: true,
iconSize: 30.0,
style: TextStyle(color: Colors.blue),
items: listStaffUsers.map(
(val) {
return DropdownMenuItem<String>(
value: val,
child: Text(val),
);
},
).toList(),
onChanged: (val) {
setState(
() {
selectedTech = val.toString();
},
);
},
),
),
任何指导或示例将不胜感激。
据我了解在你设置的Widget构建方式下
selectedTech = widget.staff 然后 return 像这样的小部件:
Widget build(BuildContext context) {
selectedTech = widget.staff;
return Container( ...
每当调用构建方法时(当您调用 setState 时),这将系统地将您的 selectedTech 锁定到 widget.staff。我的意思是,无论何时更改下拉菜单的值,该值都不会设置为下拉菜单上的实际值。因为您调用了 setState,所以 setState 从头开始构建小部件,并且在这些步骤中调用了 selectedTech = widget.staff。
您应该先初始化它,而不是在构建方法中,然后继续构建方法。
class _StaffHomeState extends State<StaffHome> {
String? selectedTech;
// Write a function to initialize the value of selectedTech
void initializeSelectedTech () {
selectedTech = widget.staff;
}
// Call this function in initState to initialize the value
@override
void initState() {
initializeSelectedTech();
super.initState();
}
// Then Widget build method
Widget build(BuildContext context) {
return Container( .....
通过这种方式,您首先在构建方法之前初始化值,并且每当状态发生变化时,数据将被持久化。
希望对你有帮助。
我一直在试验我的 flutter 下拉按钮。 我正在做的事情的背景。 我有一个应用程序可以创建工作并将其提供给可用的员工。我已将所有员工存储在菜单按钮的列表中。我将在下面放置代码以显示工作单下拉按钮的创建。 selectedTech 位于程序的顶部,所以这不是问题
String selectedTech = "";
Container(
// margin: EdgeInsets.only(right: 20),
width: MediaQuery.of(context).size.width / 2.5,
child: DropdownButton(
hint: Text(
selectedTech,
style: TextStyle(color: Colors.blue),
),
isExpanded: true,
iconSize: 30.0,
style: TextStyle(color: Colors.blue),
items: listStaffUsers.map(
(val) {
return DropdownMenuItem<String>(
value: val,
child: Text(val),
);
},
).toList(),
onChanged: (val) {
setState(
() {
selectedTech = val.toString();
},
);
},
),
),
以上代码完美运行。 但是,当我想更新工作单以更改可用的工作人员时,我想将下拉菜单的初始值设置为分配给该工作的工作人员,因为并不总是保证他们会更改分配的工作人员到工作。当我将所选值设置为我的初始值时,我被该值锁定并且无法更改它。 这是我用来更新工作人员的代码。
String selectedTech = "";
int the build method I add
selectedTech = widget.staff;
Container(
// margin: EdgeInsets.only(right: 20),
width: MediaQuery.of(context).size.width / 2.5,
child: DropdownButton(
hint: Text(
selectedTech,
style: TextStyle(color: Colors.blue),
),
isExpanded: true,
iconSize: 30.0,
style: TextStyle(color: Colors.blue),
items: listStaffUsers.map(
(val) {
return DropdownMenuItem<String>(
value: val,
child: Text(val),
);
},
).toList(),
onChanged: (val) {
setState(
() {
selectedTech = val.toString();
},
);
},
),
),
任何指导或示例将不胜感激。
据我了解在你设置的Widget构建方式下 selectedTech = widget.staff 然后 return 像这样的小部件:
Widget build(BuildContext context) {
selectedTech = widget.staff;
return Container( ...
每当调用构建方法时(当您调用 setState 时),这将系统地将您的 selectedTech 锁定到 widget.staff。我的意思是,无论何时更改下拉菜单的值,该值都不会设置为下拉菜单上的实际值。因为您调用了 setState,所以 setState 从头开始构建小部件,并且在这些步骤中调用了 selectedTech = widget.staff。
您应该先初始化它,而不是在构建方法中,然后继续构建方法。
class _StaffHomeState extends State<StaffHome> {
String? selectedTech;
// Write a function to initialize the value of selectedTech
void initializeSelectedTech () {
selectedTech = widget.staff;
}
// Call this function in initState to initialize the value
@override
void initState() {
initializeSelectedTech();
super.initState();
}
// Then Widget build method
Widget build(BuildContext context) {
return Container( .....
通过这种方式,您首先在构建方法之前初始化值,并且每当状态发生变化时,数据将被持久化。 希望对你有帮助。