gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:03:29 31 4
gpt4 key购买 nike

我的应用程序有很多路线,几乎每条路线都使用具有相同抽屉菜单的 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/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com