dart - 在没有动画的情况下替换 MaterialApp 中的初始路由?

我们的应用构建在 Scaffold 之上,到目前为止,我们已经能够使用 NavigatorState 中提供的调用来满足我们的大部分路由和导航要求(pushNamed()pushReplacementNamed() 等)。但是,我们不想要的是当用户从我们的抽屉 (nav) 菜单中选择一个项目时有任何类型的“推送”动画。我们希望通过导航菜单单击的目标屏幕有效地成为堆栈的新初始路径。目前我们使用 pushReplacementNamed() 来确保应用栏中没有返回箭头。但是,从右侧滑入的动画意味着正在构建堆栈。

在没有动画的情况下更改初始路线的最佳选择是什么,我们是否可以在同时为抽屉关闭动画的同时做到这一点?或者我们是否正在考虑需要从 Navigator 转移到仅使用单个 Scaffold 并在用户想要更改屏幕时直接更新“body”的情况?

我们注意到在 NavigatorState 上有一个 replace() 调用,我们认为这可能是开始查找的正确位置,但不清楚如何最初访问我们的各种路线在 new MaterialApp() 中设置。 replaceNamed() 之类的东西可能是有序的;-)

最佳答案

你在做什么听起来有点像 BottomNavigationBar ,因此您可能需要考虑其中之一,而不是 Drawer

然而,拥有一个 Scaffold 并在用户点击抽屉项目时更新 body 是一种完全合理的方法。您可能会考虑将 FadeTransition 从一个主体更改为另一个主体。

或者,如果您喜欢使用 Navigator 但不想要默认的幻灯片动画,您可以通过扩展 MaterialPageRoute 自定义(或禁用)动画。这是一个例子:

import 'package:flutter/material.dart';

void main() {
  runApp(new MyApp());
}

class MyCustomRoute<T> extends MaterialPageRoute<T> {
  MyCustomRoute({ WidgetBuilder builder, RouteSettings settings })
      : super(builder: builder, settings: settings);

  @override
  Widget buildTransitions(BuildContext context,
      Animation<double> animation,
      Animation<double> secondaryAnimation,
      Widget child) {
    if (settings.isInitialRoute)
      return child;
    // Fades between routes. (If you don't want any animation, 
    // just return child.)
    return new FadeTransition(opacity: animation, child: child);
  }
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Navigation example',
      onGenerateRoute: (RouteSettings settings) {
        switch (settings.name) {
          case '/': return new MyCustomRoute(
            builder: (_) => new MyHomePage(),
            settings: settings,
          );
          case '/somewhere': return new MyCustomRoute(
            builder: (_) => new Somewhere(),
            settings: settings,
          );
        }
        assert(false);
      }
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Navigation example'),
      ),
      drawer: new Drawer(
        child: new ListView(
          children: <Widget> [
            new DrawerHeader(
              child: new Container(
                  child: const Text('This is a header'),
              ),
            ),
            new ListTile(
              leading: const Icon(Icons.navigate_next),
              title: const Text('Navigate somewhere'),
              onTap: () {
                Navigator.pushNamed(context, '/somewhere');
              },
            ),
          ],
        ),
      ),
      body: new Center(
        child: new Text(
          'This is a home page.',
        ),
      ),
    );
  }
}

class Somewhere extends StatelessWidget {
  Widget build(BuildContext context) {
    return new Scaffold(
      body: new Center(
        child: new Text(
          'Congrats, you did it.',
        ),
      ),
      appBar: new AppBar(
        title: new Text('Somewhere'),
      ),
      drawer: new Drawer(
        child: new ListView(
          children: <Widget>[
            new DrawerHeader(
              child: new Container(
                child: const Text('This is a header'),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

https://stackoverflow.com/questions/43680902/

相关文章:

flutter - Flutter中的primaryColor和primarySwatch有什么区别

flutter - Flutter 中的 BottomNavigationBar 样式

flutter - Flutter 中的生命周期

dart - flutter : Bad state: Stream has already bee

flutter - Flutter-建立游戏的良好基础吗?

dart - Flutter 在 initState 方法中获取上下文

flutter - 另一个异常被抛出 : type 'MyApp' is not a subtype

dart - Flutter:设置AppBar的高度

flutter - 如何在 Flutter 中添加图片

flutter - 如何强制重启 Flutter 应用程序(在生产模式下)?