dart - 在所有页面 Flutter 中持久化 AppBar Drawer

标签 dart flutter

我正在尝试创建一个统一的抽屉,可以在我的应用中的所有页面上访问。如何让它在所有这些页面中持续存在,而不必在每个 dart 文件中重新创建我的自定义 Drawer 小部件?

最佳答案

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

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,以便它可以实际更改其中的页面。

正如我所说,我不推荐这种方法,因此我不会再详细介绍,而是将其作为练习留给想要进入兔子洞的读者!

关于dart - 在所有页面 Flutter 中持久化 AppBar Drawer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51659805/

相关文章:

flutter - 如何在Flutter中序列化数组的数组

flutter - 如何在 Flutter 中重新加载 Navigation.pop 上的页面?

ios - iOS-需要iOS 13+

flutter - 运行flutter pub升级的错误在5分钟后停止

Flutter 无法创建目录(操作系统错误 : Read-only file system)

flutter - 如何获取声音通知列表?

firebase - flutter : Could not find the correct Provider<EntryProvider> above this Page Widget

flutter - 从另一个属性引用属性

dart - 等待我的类初始化(或者如何等待 Future 完成)?

flutter : Cancel Timer In Dispose Not Working