12

我是 Flutter 的新手,我正在开发一个有多个屏幕的应用程序。

我想知道阻止颤振创建同一路线的多个屏幕,例如我有Page 1Page 2,如果我单击按钮导航到 Page 2 并再次单击同一个按钮,应用程序将推送第 2 页的新屏幕,我将拥有它两次,如果我单击返回按钮,它会将我发送回第一个创建的第 2 页

有没有办法只创建一次每个页面,如果它已经被推送到堆栈,然后重新打开它?

我正在使用我Navigator.push的所有导航

4

3 回答 3

6

这些答案都不正确。PushReplacement仍将创建小部件的新实例。这很容易识别您是否有一个可滚动列表RouteA并在导航到RouteB. 当您 时pushReplacement(RouteA),您会看到滚动位置已更改为初始状态。那是因为实例化了一个新的小部件,这不是您想要的行为。

您应该使用popUntil,如 JoaoSoares 先前回答的那样

于 2021-03-01T17:46:34.613 回答
5

在这里使用一个简单的逻辑

  1. 如果新页面与当前页面相同,则使用Navigator.push(context,route).

  2. 如果新页面不同,则使用Navigator.pushReplacement(context,route).


如果您使用命名路由,那么对于

  1. 与当前页面相同,使用Navigator.pushNamed(context,name).
  2. 不同的页面,使用Navigator.pushReplacementNamed(context,name).

完整的代码示例

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SO(),
    );
  }
}

class SO extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: PageOne(),
    );
  }
}

class PageOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page 1'),
      ),
      backgroundColor: Colors.amber,
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            RaisedButton(
              onPressed: () {
                print('creating replacement page 1');
                Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) {
                  return PageOne();
                }));
              },
              child: Text('Go to page 1'),
            ),
            RaisedButton(
              onPressed: () {
                print('creating new page 2');
                Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) {
                  return PageTwo();
                }));
              },
              child: Text('Go to page 2'),
            ),
          ],
        ),
      ),
    );
  }
}

class PageTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Page 2'),
      ),
      backgroundColor: Colors.brown,
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: <Widget>[
            RaisedButton(
              onPressed: () {
                print('creating new page 1');
                Navigator.push(context, MaterialPageRoute(builder: (BuildContext context) => PageOne()));
              },
              child: Text('Go to page 1'),
            ),
            RaisedButton(
              onPressed: () {
                print('creating replacement page 2');
                Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => PageTwo()));
              },
              child: Text('Go to page 2'),
            ),
          ],
        ),
      ),
    );
  }
}
于 2019-12-23T15:44:35.200 回答
3

你应该使用Navigator.pushReplacement(). 以下是文档:https ://api.flutter.dev/flutter/widgets/NavigatorState/pushReplacement.html

总之,当您调用 时pushReplacement,它会推送一个新页面,但也会处理前一个页面。现在,当您按下后退按钮时,它应该会带您回到第 1 页。

于 2019-12-23T14:58:27.093 回答