在 Flutter 中制作固定的应用程序范围菜单,而不是平板电脑上的抽屉

2024-02-23

我的应用程序有很多路线,几乎每条路线都使用带有相同抽屉菜单的 Scaffold 在应用程序内部导航(我自己的 CustomDrawer 小部件)。对于大屏幕的设备,我希望始终在布局中显示左侧的菜单,而不是使用抽屉(它在Gmail应用程序中的工作原理如下。我附上了图片)。换句话说,我需要制作一个带有固定菜单的响应式布局。

我尝试过的:

  • 我知道你可以使用LayoutBuilder来学习约束大小;
  • 在每条路线内制作相同的布局是可行的,但这是一个糟糕的解决方案,因为每条路线都会为自己构建菜单(滚动位置会不同,许多菜单会有很多状态等)。我需要为许多不同的路线提供一个应用程序范围的菜单,但不可能在顶级路线上进行布局;
  • 将所有路线压缩为一条路线并更改主要内容的状态将需要大量重构,而且听起来一点也不好。

在 React 中,应用程序布局看起来像这样:

    <App>
      <Menu />
      <main className="content">
        <Switch>
          <Route path="/about" component={About} />
          <Route path="/contact" component={Contact} />
          <Route path="/" component={Home} />
        </Switch>
      </main>
    </App>

但我不知道如何在 Flutter 中制作这样的东西。

tl;dr:为了使 UI 响应大屏幕,我想显示固定菜单而不是抽屉。整个应用程序的一个菜单,而不是每条路线的菜单。


诀窍是使用嵌套导航器。如果视口的宽度很大,我将菜单与内容放在一行中,否则将菜单传递给Scaffold as drawer范围。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  final String title;

  MyHomePage({Key key, this.title}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final routes = List.generate(20, (i) => 'test $i');

  final navigatorKey = GlobalKey<NavigatorState>();

  bool isMenuFixed(BuildContext context) {
    return MediaQuery.of(context).size.width > 500;
  }

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);

    final menu = Container(
      color: theme.canvasColor,
      child: SafeArea(
        right: false,
        child: Drawer(
          elevation: 0,
          child: ListView(
            children: <Widget>[
              for (final s in routes)
                ListTile(
                  title: Text(s),
                  onTap: () {
                    // Using navigator key, because the widget is above nested navigator  
                    navigatorKey.currentState.pushNamedAndRemoveUntil(s, (r) => false);

                    // navigatorKey.currentState.pushNamed(s);
                  },
                ),
            ],
          ),
        )
      )
    );

    return Row(
      children: <Widget>[
        if (isMenuFixed(context))
          menu,
        Expanded(
          child: Navigator(
            key: navigatorKey,
            initialRoute: '/',
            onGenerateRoute: (settings) {
              return MaterialPageRoute(
                builder: (context) {
                  return Scaffold(
                    appBar: AppBar(
                      title: Text(settings.name),
                    ),
                    body: SafeArea(
                      child: Text(settings.name),
                    ),
                    drawer: isMenuFixed(context) ? null : menu,
                  );
                },
                settings: settings
              );
            },
          ),
        ),
      ],
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Flutter 中制作固定的应用程序范围菜单,而不是平板电脑上的抽屉 的相关文章

  • 滑动时向 PageView 添加新页面

    我目前正在制作一个日历应用程序 我想向右或向左滑动以转到下个月或上个月 我使用 PageView 时首先设置了一个包含 3 个项目的数组 第一个页面是第二个项目 我想向右滑动并在末尾添加一个页面 我想向左滑动并在开头添加一个页面 目前 如果
  • Flutter中如何在弹出屏幕后调用函数更新值?

    屏幕 1 显示带有添加按钮的项目列表 屏幕 2 用于将新项目添加到列表的表单 屏幕 2 gt gt 屏幕 1 在屏幕 2 中调用 navigator pop 时 如何在屏幕 1 中调用方法 setState 更新列表 谁能帮我吗 我不想再次
  • 使用 flutter 处理 Appcheck 时出错

    我想在 firebase 存储中上传文件 但经过多次研究后出现了 appcheck 错误 我发现我必须在 firebase 上激活 Appcheck 而且还要在我的应用程序上激活它 在 youtube 上的谷歌视频中 我看到我必须在构建我的
  • Flutter - 当用户移动到其他(预览)屏幕时如何正确暂停相机?

    我需要pause当我移动到导航树上的另一个屏幕以节省电池和性能时相机 我尝试过了dispose cameraController 但 flutter 从另一个屏幕返回时不会重新初始化状态 但这很明显 我使用相机的主要代码 override
  • 在 flutter 中将 JSON 解析为 Map

    我收到后端的响应 measurements pm10 name pm10 value 20 8647 unit g m pm25 name pm10 value 20 8647 unit g m o2 name pm10 v
  • 带 NestedScrollview 的 RefreshIndicator

    我想要 2 个带有 ListView 的选项卡页共享一个 RefreshIndicator 但是 RefreshIndicator 必须具有 Scrollable 作为子级 TabBarView 则不然 因此我尝试为每个选项卡创建 2 个
  • 当 flutter 应用程序终止时,普通推送通知会默默出现或根本不出现

    我在 nodejs 上使用 firebase admin 向用户发送推送通知 https firebase google com docs admin setup https firebase google com docs admin s
  • Flutter 中没有上下文的 AlertDialog

    我想在 http 获取失败时显示 AlertDialog 函数显示对话框 https api flutter dev flutter material showDialog html https api flutter dev flutte
  • 在 dart 的 MultipartRequest 中添加授权标头

    我在用多部分请求 https pub dartlang org documentation http latest http MultipartRequest class html在 Dart 中以便将文件上传到 API 但是我需要在我的请
  • flutter web http.get 返回“不支持的操作:Platform._version”

    我正在开发 flutter web 应用程序并尝试从互联网获取一些数据 我正在使用包 http http dart 并尝试这样做 await http get url 但我得到了这个错误 不支持的操作 Platform version da
  • 如何更改文本字段颤动内部的值?

    我有一个TextEditingController如果用户单击按钮 它就会填写信息 我似乎不知道如何更改 a 中的文本Textfield or TextFormField 有解决办法吗 只需更改text财产 TextField contro
  • Flutter:一张带有圆形头像的卡片,非常引人注目

    我想做一张卡片CircleAvatar 突出显示 您可以在这张图片中看到详细信息 我不知道它是如何工作的 我尝试了一些Stack和定位小部件 但它不起作用 Stack确实是解决方案 Stack children
  • Flutter:如何移动文本字段字符计数器?

    标题很好地总结了这个问题 我有一个TextField with a maxLength 250这就是它的样子 有没有办法把柜台放在其他地方 最好位于发送按钮的左侧 但也可能位于发送按钮的上方和左侧TextField 有任何想法吗 谢谢 可能
  • BottomAppBar浮动操作按钮凹口/插入不透明

    我添加了一个BottomAppBar到材质应用程序中的脚手架 并且我添加了一个在中心带有插图的工厂 代码看起来有点像这样 Scaffold bottomNavigationBar BottomAppBar color Theme of co
  • NestedScrollView 与 ListView 中的粘性选项卡

    布局按预期工作 但以下情况除外 当我滚动一页时 第二页也会滚动 没有那么多 但足以掩盖第一个项目 我可以想象它与 NestedScrollView 有关 但我不知道如何继续 import package flutter material d
  • 谷歌地图颤动检查点是否在多边形内

    我正在使用 google maps flutter 插件开发 flutter 项目 我想检查用户位置是否位于我在地图上创建的多边形内 有一个简单的方法使用 JavaScript api con tainsLocation 方法 但对于 fl
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • 如何在Flutter中使用多个ChangeNotifierProvider?

    我最近开始使用provider对于我的状态管理 我知道如何一次使用一个 class Home extends StatelessWidget override Widget build BuildContext context return
  • 自定义卡片形状 Flutter SDK

    我在 Flutter 上使用 GridView 开发了一个应用程序 GridView 项目是卡片 默认卡片形状是半径为 4 的矩形 我知道 Card Widget 有 shape 属性 并且它需要 ShapeBorder 类 但我无法找到如
  • 配置根项目“firebase_auth”时出现问题

    my error 我无法构建 apk 发布文件 我完成了应用程序一段时间 没有出现错误 几天后 我在构建应用程序时收到此错误 请告诉我如何摆脱它 我尝试了 4 个小时 什么也没得到 FAILURE Build failed with an

随机推荐

  • 如何判断下拉菜单是否有可供选择的选项?

    如何判断下拉菜单是否有可供选择的选项 var menu getElementById select id if menu options length has children else empty
  • 如何使用 JAXB 和 spring-boot 将 XML 转换为字符串?

    当我运行mvn spring boot run在包含 pom xml 文件的文件夹上 应用程序启动并将 POJO 正确序列化为 XML 但是当我通过转到目标文件夹并使用以下命令启动它时java jar在我得到的jar文件中javax xml
  • SCRIPT87:参数无效

    我有一个 jquery 函数 可以在所有浏览器中运行 但不能在兼容模式下的 ie7 和 ie 9 中运行 问题出在这个函数中 non attivo live click function clearInterval start slide
  • Servlet 3.1 - 安全约束 - 没有 web.xml

    Java Servlet 3 0 和 3 1 规范允许开发人员在 Java 代码中执行许多常见的基于配置的任务 而不是通过提供 web xml 文件的传统机制 我的应用程序已经完成了所有这些工作 但是在寻求解决应用程序安全性时 我找不到任何
  • React+Jest - 测试异步组件并等待安装

    我正在尝试测试一个具有异步功能的 React 组件componentDidMount Promise 本身不需要被嘲笑 它不一定用于访问外部内容 主要只是 props 的包装 但是 为了测试它 我需要使用wrapper update 4 t
  • 在 C++ 中将序列化的 Thrift 结构序列化到 Kafka

    我有一套structs定义于Thrift例如以下内容 struct Foo 1 i32 a 2 i64 b 我需要执行以下操作C a 序列化实例Foo转换为 Thrift 兼容字节 使用Binary or Compact节俭协议 b 将字节
  • Objective C 中的 INT32U 和 INT8U

    我在声明下方遇到错误 当声明 INT32U 时 我得到 错误 Though INT32U和 int 是 4 个字节 我如何声明 INT8U 的等价物 我不能使用 int 这里作为它的INT8U是2个字节 INT32U C Uucode IN
  • JavaScript - 动态创建 SVG 并修改光标

    假设我有一个 HTML5 画布 在本例中使用 Fabric js 并且我想更改画布上的光标以表示已选择的画笔大小和颜色 我认为应该有一种方法可以通过使用 JS 动态更改 SVG 的属性 大小和颜色 来做到这一点 这样我们就不必使用多个图像
  • React Native热重载刷新但不更新更改

    我了解 React 的基础知识 并在 React 上完成了一些个人项目 现在我开始反应本机 https facebook github io react native 所以我创建了一个新项目并运行run android命令 它完成了所有必需
  • 隐藏 UITabBarController 中的顶部栏

    如何使用 OBJ C 代码 不使用 Interface Builder 隐藏 UITabBarController 中的顶部栏 请参阅下面链接中的图片以更好地了解我的要求 http skitch com jugsvn dxkr7 iphon
  • 如何对 MIME 消息中 Content-Disposition 标头的文件名参数值进行编码?

    通过查看一些邮件的来源 我发现很多邮件都使用了 Encoded Words RFC 2047 https www ietf org rfc rfc2047 txt 格式对文件名参数值进行编码 然而 根据 RFC 2047 这种编码方法不应用
  • Facebook SDK 是否使用 IDFA 进行移动应用程序安装?

    当您集成 Facebook SDK 来跟踪移动应用程序安装时 这是否使用 IDFA 因此您是否必须回答yes提交应用程序供审核时 iTunes Connect 问题中的相应问题 这是代码中的application didFinishLaun
  • 组件宽度属性发生意外变化

    我注意到运行下面列出的程序有时会产生不需要的效果 编辑 我简化了代码以使事情看起来更清晰 我正在绘制一个字符串 它打印出当前组件的大小 我重写了 Component 类中的 getPrefferedSize 方法 并将宽度和高度分别设置为
  • Clojure 打印函数:pr 与 print

    有什么区别pr prn and print println 什么时候会使用其中一个而不是另一个 它们在以下方面有所不同 print println生产供人类消费的产出 pr prn产生读者可以阅读的输出 因此 在为人类生成输出时使用前一个函
  • Mailgun:使用解析云代码发送图像

    我有一个代码定义为 Parse Cloud define mailgunSendMail function request response var Mailgun require mailgun Mailgun initialize ph
  • 如何重定向到 root - public/index.html?

    我希望重定向到我的 application public 文件夹中的index html def get current user current user current user if current user nil redirect
  • jQuery animate() 和浏览器性能

    我有一些元素在页面上移动得非常缓慢 本质上 我在 40 秒左右的时间内减少了两个图像的左边距 从视觉上看 它的工作效果非常好 然而 在动画播放过程中 我的处理器使用率跃升至 50 左右 这也不特定于任何单一浏览器 Safari3 和 Fir
  • 如何在可编码结构中使用计算属性(swift)

    我创建了一个 可编码 结构来序列化数据集并将其编码为 Json 除了计算属性未显示在 json 字符串中之外 一切都运行良好 如何在编码阶段包含计算属性 Ex struct SolidObject Codable var height Do
  • 使用 Logback 但 Log4j 开始显示 WARN no Appenders

    我正在使用 logback 进行日志记录 但它一直在工作 前几天我开始收到警告 log4j WARN 找不到记录器 org apache axis i18n ProjectResourceBundle 的附加程序 log4j WARN 请正
  • 在 Flutter 中制作固定的应用程序范围菜单,而不是平板电脑上的抽屉

    我的应用程序有很多路线 几乎每条路线都使用带有相同抽屉菜单的 Scaffold 在应用程序内部导航 我自己的 CustomDrawer 小部件 对于大屏幕的设备 我希望始终在布局中显示左侧的菜单 而不是使用抽屉 它在Gmail应用程序中的工