簡體   English   中英

flutter 中的 DropdownButton 中的多個 Select

[英]Multiple Select in DropdownButton in flutter

我知道有很多方法 / package 在 flutter 的下拉按鈕中實現多個 select 就像 --> 這個但是以我的知之甚少,我想重新發明輪子以進行基本建設

我的場景->

我有一個像這樣的 json 格式的位置列表 -->

[{id: 928, location: Amtoli}, {id: 905, location: Ashok Tala}, {id: 899, location: Badur Tola}]

和兩個列表 -->

List _location = new List(); // this comes from API;
List _multiSelectLoc = new List();

DropDownButtononChanged屬性中 -->

    onChanged: (newValue) {
setState(() {
  _location.forEach((e) {
  if (e["id"] == newValue.toString()) {
    _multiSelectLoc.add(e);
    print(_multiSelectLoc);
  }
});
  _location.removeWhere(
      (e) => e['id'] == newValue.toString());
  print(_location);
});
},

我很想知道為什么我的代碼不起作用,為什么我不能從 List _location 中刪除數據,並添加到 List _multiSelectLoc

我已經在 dartpad 中模擬了這種情況,而且還可以正常工作! 在此處輸入圖像描述

您可以通過使用自定義小部件來做到這一點,例如:

class MultiSelectDialogItem<V> {
  const MultiSelectDialogItem(this.value, this.label);

  final V value;
  final String label;
}

class MultiSelectDialog<V> extends StatefulWidget {
  MultiSelectDialog({Key key, this.items, this.initialSelectedValues}) : super(key: key);

  final List<MultiSelectDialogItem<V>> items;
  final Set<V> initialSelectedValues;

  @override
  State<StatefulWidget> createState() => _MultiSelectDialogState<V>();
}

class _MultiSelectDialogState<V> extends State<MultiSelectDialog<V>> {
  final _selectedValues = Set<V>();

  void initState() {
    super.initState();
    if (widget.initialSelectedValues != null) {
      _selectedValues.addAll(widget.initialSelectedValues);
    }
  }

  void _onItemCheckedChange(V itemValue, bool checked) {
    setState(() {
      if (checked) {
        _selectedValues.add(itemValue);
      } else {
        _selectedValues.remove(itemValue);
      }
    });
  }

  void _onCancelTap() {
    Navigator.pop(context);
  }

  void _onSubmitTap() {
    Navigator.pop(context, _selectedValues);
  }

  @override
  Widget build(BuildContext context) {
    return AlertDialog(
      title: Text('Select animals'),
      contentPadding: EdgeInsets.only(top: 12.0),
      content: SingleChildScrollView(
        child: ListTileTheme(
          contentPadding: EdgeInsets.fromLTRB(14.0, 0.0, 24.0, 0.0),
          child: ListBody(
            children: widget.items.map(_buildItem).toList(),
          ),
        ),
      ),
      actions: <Widget>[
        FlatButton(
          child: Text('CANCEL'),
          onPressed: _onCancelTap,
        ),
        FlatButton(
          child: Text('OK'),
          onPressed: _onSubmitTap,
        )
      ],
    );
  }

  Widget _buildItem(MultiSelectDialogItem<V> item) {
    final checked = _selectedValues.contains(item.value);
    return CheckboxListTile(
      value: checked,
      title: Text(item.label),
      controlAffinity: ListTileControlAffinity.leading,
      onChanged: (checked) => _onItemCheckedChange(item.value, checked),
    );
  }
}

之后使用它如下:

void _showMultiSelect(BuildContext context) async {
  final items = <MultiSelectDialogItem<int>>[
    MultiSelectDialogItem(1, 'Dog'),
    MultiSelectDialogItem(2, 'Cat'),
    MultiSelectDialogItem(3, 'Mouse'),
  ];

  final selectedValues = await showDialog<Set<int>>(
    context: context,
    builder: (BuildContext context) {
      return MultiSelectDialog(
        items: items,
        initialSelectedValues: [1, 3].toSet(),
      );
    },
  );

  print(selectedValues);
}

在此處輸入圖像描述

我想我發現了問題,

重寫代碼-->

onChanged: (newValue) {
                      _location.forEach((e) {
                        if (e['id'].toString() == newValue.toString()) {
                          _multiSelectLoc.add(e);
                          // print(_multiSelectLoc);
                        }
                      });
                      _location.removeWhere(
                          (e) => e['id'].toString() == newValue.toString());
                      setState(() {
                        // print(_location);
                      });
                    },

我認為問題是,我使用動態類型與字符串類型進行比較,當我添加.toString()代碼開始給我結果!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM