一尘不染

在所有页面上都存在AppBar抽屉

flutter

我正在尝试创建一个统一的抽屉,该抽屉可在我的应用程序的所有页面中访问。如何使它在所有这些页面中持久存在,而不必在每个飞镖文件中重新创建自定义抽屉小部件?


阅读 286

收藏
2020-08-13

共1个答案

一尘不染

有几种不同的选择。最基本的希望是您已经完成的事情,但是无论如何我都会列出它:

1:为您的抽屉创建一个类

您的小部件应该是其自己的有状态或无状态小部件。这样,您只需每次都实例化它。

class MyDrawer extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Drawer(...);
  }
}

然后在每个页面中使用它时:

Scaffold(
  drawer: MyDrawer(...),
  ...
)

希望您已经这样做了;如果不是,你应该是。类的构建函数不应太大,否则会导致性能降低和难以维护代码;从长远来看,将事物分解为逻辑单元将对您有帮助。

2: 为脚手架创建一个类

如果必须为每个页面在支架中包含相同的抽屉仍然太多代码,则可以改用封装支架的类。本质上,它将为您实际使用的每个支架输入获取输入。

class MyScaffold extends StatelessWidget {

  final Widget body;

  MyScaffold({this.body});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
     body: body,
     drawer: MyDrawer(...),
    );
  }
}

然后,不要在代码中使用Scaffold,而要使用MyScaffold(但请使用更好的名称= D)。

3:多层脚手架

我只是将这种完成方式包括在内,我不建议这样做。话虽这么说,但在某些情况下,您无法通过flutter的正常工作流程来完成这些工作,例如,当用户点击抽屉中的不同项目时,是否需要自定义动画。

基本上,在这种情况下,您要做的是在MaterialApp或Navigator外部安装一个Scaffold(我相信这也意味着您必须在此之外另安装一个Navigator,但是我不确定100%)。您将在导航之外的支架上显示抽屉,而另一个支架(在导航内的每个页面上)将做您需要做的其他事情。有一些警告-
您必须确保获得正确的脚手架(即Scaffold.of(context),就其本身而言,它不会削减-
您必须获取第一个脚手架的上下文并使用它来找到更高级别的脚手架)
,您可能需要将GlobalKey(位于较低级别的脚手架中)传递给Drawer,以便它实际上可以更改其中的页面。

就像我说的那样,我不建议您使用这种方法,因此,我不会再详细介绍它,而是将其作为练习供读者阅读,如果他们想钻研那个兔子洞!

2020-08-13