Flutter:使用抽屉式菜单导航页面

时间:2020-04-09 10:21:50

标签: flutter

我正在使用抽屉为用户提供菜单,菜单项打开应用程序的不同页面。但是发生的是,打开的每个新页面都被加载到前一页的顶部。我需要用新请求的页面替换当前页面。

我的主要用户以以下方式启动应用程序:

void main() {  
  runApp(
    MaterialApp(
      home: MyJobs(),
    ),
  );
}

每个菜单项将新屏幕加载为:

ListTile(
  title: Text('Time Off Requests'),
  leading: Icon(Icons.timer_off, color: Colors.redAccent),
  onTap: () {
    Navigator.of(context).pop();
    Navigator.of(context).push(MaterialPageRoute(builder: (BuildContext context) => TimeOffRequests()));
  },
),

我知道我没有卸载当前页面。但是我不确定该怎么做。 还是有更好的方法来做到这一点?以一种更加网络化的思维方式,我想创建一个空白主体,然后将页面插入到该主体中(也许使用setState),然后每次请求另一个页面时,都使用所请求的页面重绘主体(每个页面均已创建)作为自定义小部件?)。这是一种可行的方法吗?

感谢您的帮助或建议。

保罗

2 个答案:

答案 0 :(得分:2)

使用ok_or_else()代替map_or_else(),然后使用Navigator.pop(),它将用新的屏幕替换以前的/当前的屏幕。

希望这能回答您的问题。

答案 1 :(得分:1)

据我了解,您想使用多页抽屉。 这是一种实现方法。

首先,我们创建一个抽屉菜单项

 //drawer class
    class DrawerItem {
      String title;
      IconData icon;
      IconThemeData iconThemeData;       

 DrawerItem(this.title, this.icon, this.iconThemeData);
}

然后我们按照以下步骤设置课程

class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState()
final drawerItem = [
    DrawerItem("0", Icons.home, IconThemeData(color: Colors.black)),
    DrawerItem("1", Icons.card_giftcard,
        IconThemeData(color: Colors.redAccent)),
    DrawerItem("3", Icons.directions_bike,
        IconThemeData(color: Colors.black)),
    DrawerItem("3", Icons.account_balance_wallet,
        IconThemeData(color: Colors.black)),
    DrawerItem("4", Icons.settings, IconThemeData(color: Colors.black)),
    DrawerItem("5", Icons.live_help, IconThemeData(color: Colors.black)),
  ];
...
class _HomeState extends State<Home> {
 int _selectedDrawerIndex = 0;
 _getDrawerItemWidget(int pos) {
    switch (pos) {
      case 0:
        return ScreenZero();
      case 1:
        return ScreenOne(

        );
      case 2:
        return TwoScreen();
      case 3:
        return new Three();
      case 4:
        return Settings();
      case 5:
        return Help();

      default:
        return new Text("Error");
    }
  }
 _onSelectItem(int index) {
    setState(() => _selectedDrawerIndex = index);
    Navigator.of(context).pop(); // close the drawer
  }

...
 @override
  Widget build(BuildContext context) {
    var drawerOptions = <Widget>[];
    for (var i = 0; i < widget.drawerItem.length; i++) {
      var d = widget.drawerItem[i];
      drawerOptions.add(new ListTile(
        leading: new Icon(d.icon),
        title: new Text(d.title),
        selected: i == _selectedDrawerIndex,
        onTap: () => _onSelectItem(i),
      ));
    }

    return Scaffold(
      //appbar
      appBar: AppBar(
        elevation: 0.0,
        iconTheme: IconThemeData(color: Colors.white),
        title: Text(widget.drawerItem[_selectedDrawerIndex].title,
            style: TextStyle(color: Colors.white)),
      ),
      drawer: Drawer(Column(children: drawerOptions)
       body: _getDrawerItemWidget(_selectedDrawerIndex),
....