flutter - 在 Flutter 的平板电脑上制作固定的应用范围菜单而不是 Drawer

标签 flutter flutter-layout drawer

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

example

我试过的:

  • 我知道你可以使用 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 响应大屏幕,我想显示固定菜单而不是抽屉。整个应用程序的一个菜单,而不是每条路线。

    最佳答案

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

    portrait
    landscape

    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
                  );
                },
              ),
            ),
          ],
        );
      }
    }
    

    关于flutter - 在 Flutter 的平板电脑上制作固定的应用范围菜单而不是 Drawer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58877550/

    相关文章:

    flutter - 如何在 dart 中将时间戳字符串从 24 小时格式转换为 12 小时格式?

    flutter - flutter 的 admob 的替代品

    flutter - 如何在 Flutter 小部件测试中点击列表或网格的所有项目?

    flutter - 如何在 Flutter 中正确实现数学方程 (TeX)

    flutter - 如何将底部工作表位置设置为顶部

    rest - 我的快照在futurebuilder中没有数据

    java - 加载后刷新Fragment

    flutter - 在 flutter bloc 中使用松散耦合的本地数据存储库

    material-ui - 试图让 Material-UI 裁剪抽屉在 flex 布局中工作

    android - Android应用程序中抽屉导航上的空指针异常