Flutter 下拉菜单带条件

问题描述 投票:0回答:1

我正在创建两个下拉菜单,条件是第二个下拉菜单中的值根据第一个下拉菜单中的选定值而变化。然而,我不断收到此错误,

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()
                      ],
                    ),
flutter drop-down-menu initialization
1个回答
0
投票

您的代码由于未初始化的后期变量(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;
                  });
                },
              ),
            ],
          )
      ],
    );
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.