Flutter : 下拉可重用性

Flutter : Dropdown reusability

提问人:Mohammed Safvan 提问时间:9/20/2022 最后编辑:Mohammed Safvan 更新时间:9/20/2022 访问量:48

问:

我需要重用一个下拉小部件,所以我创建了一个方法。我是这样打电话的:

buildDropDown("Blood Group", bloodGroups, _groupSelected),

方法定义:

DropdownButtonFormField2<String> buildDropDown(
    String label,
    List<String> items,
    String? selectedElement,
  ) {
    return DropdownButtonFormField2(
      items: items.map((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
      value: selectedElement,
      onChanged: (value) {
        if (value != null) {
          setState(() {
            selectedElement = value.toString();
          });
        }
        log(selectedElement); // correct value
        log(_groupSelected); // null; though I am giving _groupSelected as selectedElement
      },
      
      hint: Text(label),
    );
  }

因此,我认为这是由于传递值,并决定给出一个函数作为参数来更改变量。但我不知道怎么做,因为:

() => selectedElement = value.toString(); // "value" only available in the onChange:

我尝试创建一个小部件,但它没有按预期工作

法典:

class DropDownWidget extends StatefulWidget {
  DropDownWidget(
      {Key? key,
      required this.selectedElement,
      required this.label,
      required this.elements})
      : super(key: key);

  String? selectedElement;
  String label;
  List<String> elements;

  @override
  State<DropDownWidget> createState() => _DropDownWidgetState();
}

class _DropDownWidgetState extends State<DropDownWidget> {
  @override
  Widget build(BuildContext context) {
    return DropdownButtonFormField2(
      items: widget.elements.map((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
      value: widget.selectedElement,
      onChanged: (value) {
        if (value != null) {
          setState(() => widget.selectedElement = value.toString());
        }
      },
      hint: Text(widget.label),
    );
  }
}

如何重用 DropDown?

Flutter 函数 dart 下拉列表 传递值

评论


答:

1赞 eamirho3ein 9/20/2022 #1

尝试将函数传递给它:

DropdownButtonFormField2<String> buildDropDown(String label,
      List<String> items, String? selectedElement, Function(String) onChanged) {
    return DropdownButtonFormField2(
      items: items.map((String value) {
        return DropdownMenuItem<String>(
          value: value,
          child: Text(value),
        );
      }).toList(),
      value: selectedElement,
      onChanged: onChanged,
      hint: Text(label),
    );
  }

然后我们像这样:

buildDropDown(
   "Blood Group",
   bloodGroups,
   (value) {
        if (value != null) {
          setState(() {
            _groupSelected = value.toString();
          });
        },
   }
 )