当前位置: 首页 > 知识库问答 >
问题:

使用pushReplacementNamed的路由之间的颤振传递值

黄毅
2023-03-14

我试图使用navigator.pushReplacementName()在路由之间传递值,但我没有得到它。

我不知道数据将退出pushreplacementnamed并获得routes键的正确语法和逻辑是什么。

输入下面的代码以方便理解:

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
      routes: <String, WidgetBuilder> {
        '/form': (BuildContext context) => new FormPage(email: ???, header: {'auth': ???}),
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          Navigator.pushReplacementNamed(context, '/form', {email: 'myemail@flutter.com', header: {'auth': '1234'}});
        },
        child: new Icon(Icons.navigate_next),
      ),
    );
  }
}

class FormPage extends StatefulWidget {
  FormPage({Key key, this.email, this.header}) : super(key: key);
  String email;
  Map header;
  @override
  FormPageState createState() => new FormPageState();
}

class FormPageState extends State<FormPage> {
  @override
  Widget build(BuildContext context) {
    return new Container(
      child: new Column(
        children: <Widget>[
          new Text(widget.email),
          new Text(widget.header['auth'])
        ],
      ),
    );
  }
}

更正后:

尝试使用PushReplacementName的目的是删除路由历史记录,因此如果用户按设备的后退按钮返回以前的路由,则该路由将不再存在。参考资料

此实现的原因是在登录页面上使用,如果用户已经通过Google Sign身份验证,他将被重定向到传递登录参数的下一个页面,并且无法通过设备的后退按钮返回登录页面。

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: new MyHomePage(),
      routes: <String, WidgetBuilder> {
        '/form': (BuildContext context) => new FormPage(), //new
      },
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      floatingActionButton: new FloatingActionButton(
        onPressed: () {
          Navigator.of(context).pushReplacement(                                                         //new
            new MaterialPageRoute(                                                                       //new
              settings: const RouteSettings(name: '/form'),                                              //new
              builder: (context) => new FormPage(email: 'myemail@flutter.com', header: {'auth': '1234'}) //new
            )                                                                                            //new
          );                                                                                             //new
        },
        child: new Icon(Icons.navigate_next),
      ),
    );
  }
}

class FormPage extends StatefulWidget {
  FormPage({Key key, this.email, this.header}) : super(key: key);
  String email;
  Map header;
  @override
  FormPageState createState() => new FormPageState();
}

class FormPageState extends State<FormPage> {
  @override
  Widget build(BuildContext context) {
    return new Container(
      child: new Column(
        children: <Widget>[
          new Text(widget.email),
          new Text(widget.header['auth'])
        ],
      ),
    );
  }
}

共有1个答案

左丘成仁
2023-03-14

我想你可能没有理解结果是如何工作的。结果将返回到推送最后一条路由的上一个小部件,并使用await来获取由上一次调用push返回的future的结果。您只想用参数启动路由吗?那你可以这么做。

Navigator.of(context).pushReplacement(
  new MaterialPageRoute(
    settings: const RouteSettings(name: '/form'),
    builder: (context) => new FormPage(
      email: 'myemail@flutter.com',
      header: {'auth': '1234'},
    ),
  ),
);
 类似资料:
  • 问题内容: 我遇到的情况是表单跨越了几页(可能并不理想,但这就是事实)。我想为整个表单提供一个范围,以便您随身携带,以便用户在步骤之间来回移动时很容易记住状态。 所以我需要用非常伪的代码来做: 组 单击一个链接,然后将其路由到新模板(可能使用同一控制器)。 仍应与最后一页上的值相同。 是否以某种方式持久保存示波器的数据是解决此问题的正确方法,还是还有其他方法?您是否甚至可以创建一个在路由之间具有持

  • 我有一个小部件,其中有两个小部件作为子部件,我希望它们之间有一些空间。 我已经尝试了,但结果不是我想要的。

  • Navigating Programmatically

  • 问题内容: 我面临着在两个状态之间传递数据而不暴露url中数据的问题,就像用户不能真正直接进入此状态一样。 例如。我有两个状态“ A”和“ B”。我正在状态“ A”进行一些服务器调用,并将调用的响应传递到状态“ B”。服务器调用的响应是一个字符串消息,该消息很长,因此我无法在url中公开它。 那么,有角度的ui路由器中有什么方法可以在不使用url参数的情况下在状态之间传递数据吗? 问题答案: 我们

  • 如何配置Flutter SDK?如何定位颤振SDK?我不知道SDK文件的位置。

  • 我试图使用react router将props从app.jsx传递到某个路由组件,但出现以下错误