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( .....

通过这种方式,您首先在构建方法之前初始化值,并且每当状态发生变化时,数据将被持久化。 希望对你有帮助。