Flutter 可滚动导航抽屉,其中一个菜单项与底部对齐

Kay*_*yes 2 flutter flutter-layout

我有一个带有一堆项目的导航抽屉,我希望注销项目与抽屉的最底部对齐。

return Drawer(
  child: Column(
    children: [
      DrawerAccountHeader(UserType.worker),
      DrawerNavigationItem(
        "Home", 
        Icons.home,
      ),
      new ListTile(
        title: new Text('Jobs', style: TextStyle(color: Colors.black54),),
        dense: true,
      ),
      DrawerNavigationItem(
        "Nearby", 
        Icons.location_on, 
      ),
      DrawerNavigationItem(
        "Applied", 
        Icons.check_circle_outline, 
      ),
      DrawerNavigationItem(
        "Hired", 
        Icons.check_circle, 
      ),
      Expanded(child: Container()),
      Divider(),
      DrawerNavigationItem(
        "Logout",
        Icons.exit_to_app,               
      )
    ],
  ),
);
Run Code Online (Sandbox Code Playgroud)

看起来怎么样

但在较小的屏幕上,我收到溢出错误,因为最上面的列高度大于屏幕高度。因此,我尝试将列更改为列表框,然后出现异常“垂直视口被赋予无界高度”,因为我在项目之间有 Expanded() 来形成间隙,以便登录按钮粘在列表的底部。

下面有什么办法可以实现吗?

  1. 当有垂直空间时,将登录按钮(可能还有一组按钮)固定在屏幕底部。
  2. 当没有足够的垂直空间时,使抽屉项目可滚动。
  3. (nice to have) 可滚动的,整个抽屉都可以滚动。即,在小屏幕上,用户需要滚动抽屉才能到达注销选项。

Cra*_*Cat 7

尝试这个,

Drawer(
  child: LayoutBuilder(
    builder: (context, constraint) {
      return SingleChildScrollView(
        child: ConstrainedBox(
          constraints: BoxConstraints(minHeight: constraint.maxHeight),
          child: IntrinsicHeight(
            child: Column(
              children: <Widget>[
                DrawerHeader(
                  margin: EdgeInsets.all(0.0),
                  child: Center(
                    child: Text("Header"),
                  ),
                ),
                ListTile(
                  leading: Icon(Icons.home),
                  title: Text("Home"),
                  onTap: () {},
                ),
                new ListTile(
                  title: new Text(
                    'Jobs',
                    style: TextStyle(color: Colors.black54),
                  ),
                  dense: true,
                ),
                ListTile(
                  leading: Icon(Icons.location_on),
                  title: Text("Nearby"),
                  onTap: () {},
                ),
                ListTile(
                  leading: Icon(Icons.check_circle_outline),
                  title: Text("Applied"),
                  onTap: () {},
                ),
                ListTile(
                  leading: Icon(Icons.check_circle),
                  title: Text("Hired"),
                  onTap: () {},
                ),
                const Expanded(child: SizedBox()),
                const Divider(height: 1.0, color: Colors.grey),
                ListTile(
                  leading: Icon(Icons.exit_to_app),
                  title: Text("Logout"),
                  onTap: () {},
                )
              ],
            ),
          ),
        ),
      );
    },
  ),
)
Run Code Online (Sandbox Code Playgroud)