Flutter - 使用 PushReplacementNamed 在路由之间传递值

2024-05-10

我正在尝试使用以下方式在路线之间传递值Navigator.pushReplacementNamed(),但我不明白。

我无法弄清楚数据退出的正确语法和逻辑是什么pushReplacementNamed并得到routes key.

你能帮助我吗?

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

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: '[email protected] /cdn-cgi/l/email-protection', 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'])
        ],
      ),
    );
  }
}

修正后:

尝试使用的目的pushReplacementNamed目的是删除路线历史记录,因此,如果用户按设备的后退按钮返回到之前的路线,则该路线将不再存在。参考 https://stackoverflow.com/questions/44978216/flutter-remove-back-button-on-appbar

此实现的原因是要在登录页面上使用,如果用户已经通过了身份验证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: '[email protected] /cdn-cgi/l/email-protection', 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'])
        ],
      ),
    );
  }
}

我想你可能不明白结果是如何运作的。结果返回到前一个推送最后一条路线并正在使用的小部件await对于结果Future由上一次调用发回push。您只想用参数开始一条路线吗?然后你就可以这样做。

Navigator.of(context).pushReplacement(
  new MaterialPageRoute(
    settings: const RouteSettings(name: '/form'),
    builder: (context) => new FormPage(
      email: 'myema[email protected] /cdn-cgi/l/email-protection',
      header: {'auth': '1234'},
    ),
  ),
);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter - 使用 PushReplacementNamed 在路由之间传递值 的相关文章

  • 在 Dartlang 中下载大文件

    我需要使用 dartlang 从浏览器下载较大的文件 我一直在使用 data uri 来下载 但已经达到了该方法的大小限制 想知道最好的方法是什么 我研究了使用 HTML5 文件系统 API 但它已被弃用 显然在大多数浏览器中从未真正实现过
  • iOS 有 INTERNET 权限吗?

    我在 iOS 设备上的 flutter dio 包上遇到了一个奇怪的问题 我编写了一个向 url 发送 GET 请求的应用程序 Android 上一切正常 但 iOS 上的请求似乎无法通过 没有发生任何错误 什么也没有 我在 Android
  • Pub 失败,[1] 解决依赖关系... code_transformers 的版本约束不兼容

    下面是我的 pubspec yaml 文件 name MyApp description A sample command line application dependencies csv sheet any redstone any s
  • 如何在flutter上关注android tv应用程序中的列表视图项目

    我想在 flutter 中构建一个 android 电视应用程序 几乎所有事情都已完成 但一个问题是我无法集中注意力 例如一些弹出效果或边框更改任何告诉用户您现在正在使用此项目的内容 我们在列表视图中迭代的项目 我想要在应用程序中看到的图像
  • 在Flutter中,如何使按钮和文本字段具有相同的高度?

    我知道TextField has TextStyle 其中有一个height财产 这只是一个基于的乘数fontSize 但是如何使所有小部件具有相同的高度 无论字体大小 此外 是否有以下等效方法 在几乎任何其他编程语言中 btnLogin
  • 如何在 flutter 中获取应用内购买的唯一标识符,该标识符始终保持不变

    我正在使用在应用程序内购买 https pub dev packages in app purchase我的 Flutter 应用程序的包 我的应用程序中有一项非消耗性应用内购买 每个用户创建一个用户帐户 使用 Firebase 身份验证
  • 如何在 Dart 中运行交互式流程?

    下面的测试尝试运行 less pager 命令并返回一次 用户退出 问题是它不等待用户输入 而是 仅列出整个文件并退出 平台 xubuntu 12 04 Dart 编辑器版本 13049 import dart io void main s
  • flutter:如何使用共享首选项保存 List

    如何持久保存一个列表List
  • iPhone 上的 Flutter 底部填充颜色

    是否可以更改 iPhone 附带的底部填充的颜色 包裹你的 材料应用程序 与下面的代码main dart class AnnotatedRegion
  • Flutter - TextPainter 与 Paragraph 绘制书页

    我需要显示长文本 这将占用几个屏幕 页面 我还必须添加一些功能 所以我想实现我自己的文本显示组件 我找到了与此任务相对应的两个类 文本绘制器 use TextSpan对于文本 use 油漆 画布 胶印 用于绘画 段落使用 队列 作为文本和样
  • 异常:由于上述问题,无法构建插件 firebase_admob

    我有一个问题 当我在 pubspec yaml 中添加插件 firebase admob 0 11 0 1 时 会出现此错误 失败 构建失败并出现异常 出了什么问题 任务 app processDebugResources 执行失败 执行
  • 天文台服务器启动失败 - 无法创建套接字服务器

    我正在为自己构建一些内部工具 以使用我设置的一些模板以及可以在应用程序之间共享的一些附加功能来生成 Flutter 应用程序 目前 代码可以编译 构建并部署 但它会卡在第一个视图 空白屏幕 上 并在失败之 前重试启动 Observatory
  • viewportFraction < 1.0 的 PageView 非中心对齐

    当您为 PageController 创建 viewportFraction 值为 我希望当前页面捕捉到视口的顶部 而下一页呈现在底部栏下方 我尝试对每个页面应用转换 Transform translate offset Offset 0
  • 无法解析符号 FlutterActivity

    我使用 VCS gt Checkout from Version Control 将 flutter 项目从 github 导入到 Android Studio 中 现在我面临的问题是 Cannot resolve symbol Flutt
  • 如何根据父级的大小来布局小部件?

    假设您有一个可能具有可变大小的父窗口小部件 例如 var container new Container height 200 0 Imagine this might change width 200 0 Imagine this mig
  • Dart:使用 html 导入时隔离不起作用

    我在 Dart 中发现了这种非常奇怪和不幸的行为 当我在主文件中导入 dart html 时 我的 Isolate 停止工作 使用我的文件 isolate dart main print BAM 这会打印 BAM import dart c
  • 使用 Flutter Flavor 运行调试?

    我正在尝试在 Visual Studio 代码上为我的 flutter 应用程序运行调试模式 单击 运行和调试 但是当我这样做时 我面临以下问题 The Xcode project defines schemes release priva
  • 是否可以从图像中获取图像 GPS 位置坐标?

    我正在构建一个 Flutter 应用程序 用户可以在其中发布照片及其位置 用户可以从相机或图库中获取图片 如果用户从相机拍照 我可以使用设备的 GPS 位置来设置图片的位置 我正在尝试根据图片的元数据获取图片的 GSP 位置 但是 我还没有
  • TabController 中的通知监听器用于无限滚动

    我有 4 个选项卡 我想在其中添加延迟加载或无限滚动选项 早些时候我尝试使用滚动控制器 但当它到达末尾时 事件触发多次 因此 有多个 Future http 请求到 API 我读了一些关于SO的问题 发现我可能需要使用Notificatio
  • 如何为 flutter 绘图应用实现橡皮擦功能

    有一个关于通过 flutter 创建绘图应用程序的视频 YouTube https www youtube com watch v yyHhloFMNNA 它支持当用户点击屏幕时绘制线 点 但我找不到像 Android 本机那样擦除用户绘制

随机推荐