Flutter 有没有一种方法可以在Flitter中制作漂亮的下拉菜单?

Flutter 有没有一种方法可以在Flitter中制作漂亮的下拉菜单?,flutter,drop-down-menu,Flutter,Drop Down Menu,我想制作这样漂亮的下拉菜单。我已经试过用容器做了,但是花了很长时间。是否有配置默认下拉菜单和项目的软件包或方法 尝试下面这样的代码 new DropdownButton<String>( items: <String>['A', 'B', 'C', 'D'].map((String value) { return new DropdownMenuItem<String>( value: value, child: new T

我想制作这样漂亮的下拉菜单。我已经试过用容器做了,但是花了很长时间。是否有配置默认下拉菜单和项目的软件包或方法


尝试下面这样的代码

new DropdownButton<String>(
  items: <String>['A', 'B', 'C', 'D'].map((String value) {
    return new DropdownMenuItem<String>(
      value: value,
      child: new Text(value),
    );
  }).toList(),
  onChanged: (_) {},
)
新建下拉按钮(
项目:['A','B','C','D'].map((字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(值),
);
}).toList(),
一旦改变:({},
)
另一个例子

另一个例子2

尝试下面这样的代码

new DropdownButton<String>(
  items: <String>['A', 'B', 'C', 'D'].map((String value) {
    return new DropdownMenuItem<String>(
      value: value,
      child: new Text(value),
    );
  }).toList(),
  onChanged: (_) {},
)
新建下拉按钮(
项目:['A','B','C','D'].map((字符串值){
返回新的DropdownMenuItem(
价值:价值,
子项:新文本(值),
);
}).toList(),
一旦改变:({},
)
另一个例子

另一个例子2

您可以将Container()小部件与Boxdecoration一起使用,并作为子部件使用DropdownButton()小部件

使用DropdownButtonHideUnderline()作为父项隐藏默认下划线

示例代码:

Container(
  padding: const EdgeInsets.symmetric(horizontal: 12.0),
  height: 40.0,
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(30.0),
    color: Colors.yellow,
  ),
  child: DropdownButtonHideUnderline(
    child: DropdownButton() // your Dropdown Widget here
  ),
);
您可以将Container()小部件与Boxdecoration一起使用,并作为子部件使用DropdownButton()小部件

使用DropdownButtonHideUnderline()作为父项隐藏默认下划线

示例代码:

Container(
  padding: const EdgeInsets.symmetric(horizontal: 12.0),
  height: 40.0,
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(30.0),
    color: Colors.yellow,
  ),
  child: DropdownButtonHideUnderline(
    child: DropdownButton() // your Dropdown Widget here
  ),
);
试试这个:

import 'package:flutter/material.dart';

void main() => runApp(ExampleApp());

class ExampleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: PopMenu(),
    );
  }
}

class PopMenu extends StatefulWidget {
  @override
  _PopMenuState createState() => _PopMenuState();
}

class _PopMenuState extends State<PopMenu> {
  List<String> _menuList = ['menu 1', 'menu 2', 'menu 3'];
  GlobalKey _key = LabeledGlobalKey("button_icon");
  OverlayEntry _overlayEntry;
  Offset _buttonPosition;
  bool _isMenuOpen = false;

  void _findButton() {
    RenderBox renderBox = _key.currentContext.findRenderObject();
    _buttonPosition = renderBox.localToGlobal(Offset.zero);
  }

  void _openMenu() {
    _findButton();
    _overlayEntry = _overlayEntryBuilder();
    Overlay.of(context).insert(_overlayEntry);
    _isMenuOpen = !_isMenuOpen;
  }

  void _closeMenu() {
    _overlayEntry.remove();
    _isMenuOpen = !_isMenuOpen;
  }

  OverlayEntry _overlayEntryBuilder() {
    return OverlayEntry(
      builder: (context) {
        return Positioned(
          top: _buttonPosition.dy + 70,
          left: _buttonPosition.dx,
          width: 300,
          child: _popMenu(),
        );
      },
    );
  }

  Widget _popMenu() {
    return Material(
      child: Container(
        width: 300,
        height: 300,
        decoration: BoxDecoration(
          color: Color(0xFFF67C0B9),
          borderRadius: BorderRadius.circular(4),
        ),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: List.generate(
            _menuList.length,
            (index) {
              return GestureDetector(
                onTap: () {},
                child: Container(
                  alignment: Alignment.center,
                  width: 300,
                  height: 100,
                  child: Text(_menuList[index]),
                ),
              );
            },
          ),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          key: _key,
          width: 300,
          height: 50,
          decoration: BoxDecoration(
            color: Color(0xFFF5C6373),
            borderRadius: BorderRadius.circular(25),
          ),
          child: Row(
            children: [
              Expanded(
                child: Center(child: Text('menu 1')),
              ),
              IconButton(
                icon: Icon(Icons.arrow_downward),
                color: Colors.white,
                onPressed: () {
                  _isMenuOpen ? _closeMenu() : _openMenu();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(ExampleApp());
类ExampleApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
主页:PopMenu(),
);
}
}
类PopMenu扩展StatefulWidget{
@凌驾
_PopMenuState createState()=>\u PopMenuState();
}
类_popmenstate扩展状态{
列表_menuList=[‘菜单1’、‘菜单2’、‘菜单3’];
GlobalKey _key=LabeledGlobalKey(“按钮图标”);
过度进入(OverlayEntry);;
偏移按钮位置;
bool _isMenuOpen=false;
void _findButton(){
RenderBox RenderBox=_key.currentContext.FindEnderObject();
_buttonPosition=renderBox.localToGlobal(偏移量为0);
}
void _openMenu(){
_findButton();
_overlayEntry=_overlayEntryBuilder();
覆盖.of(上下文).insert(_overlayEntry);
_isMenuOpen=!\u isMenuOpen;
}
void _closeMenu(){
_覆盖入口。移除();
_isMenuOpen=!\u isMenuOpen;
}
OverlayEntry\u overlayEntryBuilder(){
返回重叠入口(
生成器:(上下文){
返回定位(
顶部:_buttonPosition.dy+70,
左:_buttonPosition.dx,
宽度:300,
子项:_popMenu(),
);
},
);
}
小部件popMenu(){
退货(
子:容器(
宽度:300,
身高:300,
装饰:盒子装饰(
颜色:颜色(0xFFF67C0B9),
边界半径:边界半径。圆形(4),
),
子:列(
mainAxisSize:mainAxisSize.min,
子项:List.generate(
_menuList.length,
(索引){
返回手势检测器(
onTap:(){},
子:容器(
对齐:对齐.center,
宽度:300,
身高:100,
子项:文本(_menuList[index]),
),
);
},
),
),
),
);
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
正文:中(
子:容器(
键:_键,
宽度:300,
身高:50,
装饰:盒子装饰(
颜色:颜色(0xFFF5C6373),
边界半径:边界半径。圆形(25),
),
孩子:排(
儿童:[
扩大(
子:居中(子:文本(“菜单1”),
),
图标按钮(
图标:图标(图标。向下箭头),
颜色:颜色,白色,
已按下:(){
_isMenuOpen?_closeMenu():_openMenu();
},
),
],
),
),
),
);
}
}
试试这个:

import 'package:flutter/material.dart';

void main() => runApp(ExampleApp());

class ExampleApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: PopMenu(),
    );
  }
}

class PopMenu extends StatefulWidget {
  @override
  _PopMenuState createState() => _PopMenuState();
}

class _PopMenuState extends State<PopMenu> {
  List<String> _menuList = ['menu 1', 'menu 2', 'menu 3'];
  GlobalKey _key = LabeledGlobalKey("button_icon");
  OverlayEntry _overlayEntry;
  Offset _buttonPosition;
  bool _isMenuOpen = false;

  void _findButton() {
    RenderBox renderBox = _key.currentContext.findRenderObject();
    _buttonPosition = renderBox.localToGlobal(Offset.zero);
  }

  void _openMenu() {
    _findButton();
    _overlayEntry = _overlayEntryBuilder();
    Overlay.of(context).insert(_overlayEntry);
    _isMenuOpen = !_isMenuOpen;
  }

  void _closeMenu() {
    _overlayEntry.remove();
    _isMenuOpen = !_isMenuOpen;
  }

  OverlayEntry _overlayEntryBuilder() {
    return OverlayEntry(
      builder: (context) {
        return Positioned(
          top: _buttonPosition.dy + 70,
          left: _buttonPosition.dx,
          width: 300,
          child: _popMenu(),
        );
      },
    );
  }

  Widget _popMenu() {
    return Material(
      child: Container(
        width: 300,
        height: 300,
        decoration: BoxDecoration(
          color: Color(0xFFF67C0B9),
          borderRadius: BorderRadius.circular(4),
        ),
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: List.generate(
            _menuList.length,
            (index) {
              return GestureDetector(
                onTap: () {},
                child: Container(
                  alignment: Alignment.center,
                  width: 300,
                  height: 100,
                  child: Text(_menuList[index]),
                ),
              );
            },
          ),
        ),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          key: _key,
          width: 300,
          height: 50,
          decoration: BoxDecoration(
            color: Color(0xFFF5C6373),
            borderRadius: BorderRadius.circular(25),
          ),
          child: Row(
            children: [
              Expanded(
                child: Center(child: Text('menu 1')),
              ),
              IconButton(
                icon: Icon(Icons.arrow_downward),
                color: Colors.white,
                onPressed: () {
                  _isMenuOpen ? _closeMenu() : _openMenu();
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}
导入“包装:颤振/材料.省道”;
void main()=>runApp(ExampleApp());
类ExampleApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
主页:PopMenu(),
);
}
}
类PopMenu扩展StatefulWidget{
@凌驾
_PopMenuState createState()=>\u PopMenuState();
}
类_popmenstate扩展状态{
列表_menuList=[‘菜单1’、‘菜单2’、‘菜单3’];
GlobalKey _key=LabeledGlobalKey(“按钮图标”);
过度进入(OverlayEntry);;
偏移按钮位置;
bool _isMenuOpen=false;
void _findButton(){
RenderBox RenderBox=_key.currentContext.FindEnderObject();
_buttonPosition=renderBox.localToGlobal(偏移量为0);
}
void _openMenu(){
_findButton();
_overlayEntry=_overlayEntryBuilder();
覆盖.of(上下文).insert(_overlayEntry);
_isMenuOpen=!\u isMenuOpen;
}
void _closeMenu(){
_覆盖入口。移除();
_isMenuOpen=!\u isMenuOpen;
}
OverlayEntry\u overlayEntryBuilder(){
返回重叠入口(
生成器:(上下文){
返回定位(
顶部:_buttonPosition.dy+70,
左:_buttonPosition.dx,
宽度:300,
子项:_popMenu(),
);
},
);
}
小部件popMenu(){
退货(
子:容器(
宽度:300,
身高:300,
装饰:盒子装饰(
颜色:颜色(0xFFF67C0B9),
边界半径:边界半径。圆形(4),
),
子:列(
mainAxisSize:mainAxisSize.min,
子项:List.generate(
_menuList.length,
(索引){
返回手势检测器(
onTap:(){},
子:容器(
对齐:对齐.center,
宽度:300,