Показывать нижний лист с опциями раскрывающегося списка при щелчке раскрывающегося списка во флаттере - PullRequest
0 голосов
/ 28 января 2020

У меня есть DropDown, который показывает различные варианты. Текущее поведение отображает параметры как DropdownMenuItem.

Как я могу переключить DropdownMenuItem на BottomSheet, который показывает все параметры в DropDown?

Текущий код :

DropdownButtonHideUnderline(
  child: Container(
    color: Color.fromRGBO(216, 216, 216, 0.33),
    padding: const EdgeInsets.fromLTRB(32, 8, 16, 8),
    child: DropdownButton<String>(
      hint: Text("TEST DROPDOWN"),
      items: <String>['A', 'B', 'C', 'D'].map((String value) {

        // this crashes
        return showModalBottomSheet(context: context, builder: (builder) {
          return Container(
            child: Text('Hello From Modal Bottom Sheet'),
            padding: EdgeInsets.all(40.0),
          );
        });

        // this works
        return new DropdownMenuItem<String>(
          value: value,
          child: new Text(value),
        );

      }).toList(),
      ...

РЕДАКТИРОВАТЬ: Я пытаюсь отобразить что-то похожее на iOS селектор даты при нажатии раскрывающегося списка.

1 Ответ

2 голосов
/ 29 января 2020

Если вы хотите создать свой собственный, вот простой пример, сделанный мной:

class ModalDropDown extends StatefulWidget {
  @override
  _ModalDropDownState createState() => _ModalDropDownState();
}

class _ModalDropDownState extends State<ModalDropDown> {
  String _selected = '';
  List<String> _items = ['A', 'B', 'C', 'D'];

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          RaisedButton(
            child: Text('Show Modal'),
            onPressed: () => showModal(context),
          ),
          Text('Selected item: $_selected')
        ],
      ),
    );
  }

  void showModal(context){
    showModalBottomSheet(
      context: context,
      builder: (context){
        return Container(
          padding: EdgeInsets.all(8),
          height: 200,
          alignment: Alignment.center,
          child: ListView.separated(
            itemCount: _items.length,
            separatorBuilder: (context, int) {
              return Divider();
            },
            itemBuilder: (context, index) {
              return GestureDetector(
                child: Text(_items[index]),
                onTap: () {
                  setState(() {
                    _selected = _items[index];
                  });
                  Navigator.of(context).pop();
                }
              );
            }
          ),
        );
      }
    );
  }
}

Если вместо этого вы хотите использовать сборщик Flutter для iOS, вы можете использовать CupertinoPicker

...