Flutter Cookbook > 将抽屉添加到屏幕上

在使用Material Design的应用程序中,导航有两个主要选项:制表符和抽屉。当没有足够的空间来支撑标签时,抽屉提供了一个方便的替代方案。

在Flutter中,我们可以将Drawer Widget与Scaffold结合使用,以使用Material Design Drawer创建布局!

导读

1.创建 Scaffold。
2.添加抽屉。
3.用物品填充抽屉。
4.以编程方式关闭抽屉。

1.创建 Scaffold

为了在我们的应用程序中添加抽屉,我们需要将其包装在Scaffold Widget中。 Scaffold Widget为遵循Material Design Guidelines的应用程序提供一致的可视化结构。它还支持特殊的Material Design组件,例如Drawers,AppBars和SnackBars。

在这种情况下,我们想要创建一个带抽屉的Scaffold:

Scaffold(
    drawer:
);

2.添加抽屉

我们现在可以在我们的脚手架上添加一个抽屉。抽屉可以是任何Widget,但通常最好使用材料库中的Drawer widget,它遵循Material Design规范。

Scaffold(
    drawer: Drawer(
        child:
    ),
);

3.用物品填充抽屉。

现在我们有一个抽屉,我们可以添加内容!在这个例子中,我们将使用ListView。虽然我们可以使用Column Widget,但ListView在这种情况下很方便,因为如果内容占用的空间比屏幕支持的更多,它将允许用户滚动抽屉。

我们将使用DrawerHeader和两个ListTile Widgets填充ListView。有关使用列表的更多信息,请参阅列表配方。

Drawer(
    child: ListView(
        padding: EdgeInsets.zero,
        children: <Widget>[
            DrawerHeader(
                child: Text('Drawer Header'),
                decoration: BoxDecoration(
                    color: Colors.blue,
                ),
            ),
            ListTile(
                title: Text('Item 1'),
                onTap: (){
                },
            ),
            ListTile(
                title: Text('Item 2'),
                onTap: (){
                },
            ),
        ],
    ),
);

4.以编程方式关闭抽屉

用户点击某个项后,我们经常要关闭抽屉。我们怎样才能做到这一点?使用导航器!

当用户打开抽屉时,Flutter会将抽屉添加到引擎盖下的导航堆栈中。因此,要关闭抽屉,我们可以调用Navigator.pop(context)。

ListTile(
    title: Text('Item 1'),
    onTap: (){
        Navigator.pop(context);
    },
),

完整例子

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
    final appTitle = 'Drawer Demo';
    
    @override
    Widget build(BuildContext context) {
        return MaterialApp(
            title: appTitle,
            home: MyHomePage(
                title: appTitle
            ),
        );
    }
}

class MyHomePage extends StatelessWidget {
    final String title;
    
    MyHomePage({Key key, this.title}) : super(key: key);
    
    @override
    Widget build(BuildContext context) {
        return Scaffold(
            appBar: AppBar(title: Text(title)),
            body: Center(child: Text('My page!')),
            drawer: Drawer(
                child: ListView(
                    padding: EdgeInsets.zero,
                    children: <Widget>[
                        DrawerHeader(
                            child: Text('Drawer Header'),
                            decoration: BoxDecoration(
                                color: Colors.blue,
                            ),
                        ),
                        ListTile(
                            title: Text('Item 1'),
                            onTap: (){
                                Navigator.pop(context);
                            },
                        ),
                        ListTile(
                            title: Text('Item 2'),
                            onTap: (){
                                Navigator.pop(context);
                            },
                        ),
                    ],
                ),
            ),
        );
    }
}

xxx0111