我试图创建一个向上展开的下拉菜单,但我无法更改方向,我认为问题可能是AnimatedContainer高度,但我不知道如何解决它.此外,我希望它是四舍五入的,我try 添加ClipRect和BorderRadius.这是我的代码:

class HomeDropdownMenu extends StatefulWidget {
  const HomeDropdownMenu({Key? key}) : super(key: key);

  @override
  _HomeDropdownMenuState createState() => _HomeDropdownMenuState();
}

class _HomeDropdownMenuState extends State<HomeDropdownMenu> {
  bool _isExpanded = false;

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: [
        GestureDetector(
          onTap: () {
            setState(() {
              _isExpanded = !_isExpanded;
            });
          },
          child: Container(
            color: Colors.blue,
            padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                const Center(
                  child: Text(
                    'Menu',
                    style: TextStyle(
                      fontSize: 20,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                Icon(
                  _isExpanded ? Icons.expand_more_rounded : Icons.expand_less_rounded,
                  size: 30,
                ),
              ],
            ),
          ),
        ),
        Transform(
          transform: Matrix4.translationValues(0.0, _isExpanded ? -20.0 : 0.0, 0.0) ,
          child: ClipRRect(
            borderRadius: const BorderRadius.only(
              topLeft: Radius.circular(20),
              topRight: Radius.circular(20),
            ),
            child: AnimatedContainer(
              duration: const Duration(milliseconds: 300),
              height: _isExpanded ? min(MediaQuery.of(context).size.height * 0.5, MediaQuery.of(context).size.height - 80) : 0,
              width: double.infinity,
              color: Colors.white,
              child: SingleChildScrollView(
                physics: const NeverScrollableScrollPhysics(),
                child: Column(
                  children: [
                      MenuOptions();
                  ],
                ),
              ),
            ),
          ),
        ),
      ],
    );
  }

推荐答案

要让下拉列表向上移动,您只需将其放在ColumnGestureDetector上方.我还改变了一些东西:

  • 您不需要ClipRRect a AnimatedConainer具有属性decoration,该属性允许设置BoxDecoration以添加BorderRadius和许多其他内容.
  • 此外,不需要Transform-Widget,AnimatedContainer本身就是一个Transform属性.
class HomeDropdownMenu extends StatefulWidget {
  const HomeDropdownMenu({Key? key}) : super(key: key);

  @override
  _HomeDropdownMenuState createState() => _HomeDropdownMenuState();
}

class _HomeDropdownMenuState extends State<HomeDropdownMenu> {
  bool _isExpanded = false;

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        AnimatedContainer(
          duration: const Duration(milliseconds: 300),
          decoration: const BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.only(
              topLeft: Radius.circular(20),
              topRight: Radius.circular(20),
            ),
          ),
          height: _isExpanded
              ? min(MediaQuery.of(context).size.height * 0.5,
                  MediaQuery.of(context).size.height - 80)
              : 0,
          width: double.infinity,
          child: SingleChildScrollView(
            physics: const NeverScrollableScrollPhysics(),
            child: Column(
              children: const [
                Text('option 1'),
                Text('option 2'),
                Text('option 3'),
                Text('option 4'),
                Text('option 5'),
              ],
            ),
          ),
        ),
        GestureDetector(
          onTap: () {
            setState(() {
              _isExpanded = !_isExpanded;
            });
          },
          child: Container(
            color: Colors.blue,
            padding: const EdgeInsets.symmetric(vertical: 10, horizontal: 20),
            child: Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                const Center(
                  child: Text(
                    'Menu',
                    style: TextStyle(
                      fontSize: 20,
                      fontWeight: FontWeight.bold,
                    ),
                  ),
                ),
                Icon(
                  _isExpanded
                      ? Icons.expand_more_rounded
                      : Icons.expand_less_rounded,
                  size: 30,
                ),
              ],
            ),
          ),
        ),
      ],
    );
  }
}

Flutter相关问答推荐

如何更新文本字段的基础上的选定下拉菜单?

无法在主屏幕视图中设置当前日期容器'

将目标平台设置为Flutter 构建

为什么要在值列表中两次放入空安全性

Flutter AppBar Animation反向调试

在选项卡栏视图中搜索和筛选不起作用

BottomNavigationBar-我应该使用Container和Align吗?

应为Map String,dynamic类型的值,但得到的值为type()= Map String,dynamic'

没有固定宽度的小部件可以约束文本小部件吗?

网页浏览器不支持鼠标滚动的行项目

Flutter底部面板局部显示

splash_screen 没有被推送到登录页面

如何停止折线图的抖动

MediaQuery 在不同手机上不一致

对话框打开时如何使背景模糊?

为什么 orientation == Orientation.portrait 总是正确的,尽管我的设备已经处于横向

将一个 Flutter 应用程序集成到另一个 Flutter 应用程序中

Flutter :RangeError(索引):无效值:不在包含范围内0..3:4使用IndexedListView.builder

在另一个页面编辑数据后更新 Flutter 页面的惯用方法?

我们什么时候在flutter中初始化一个provider?