Flutter路由跳转父级页面向子页面传参及子页面向父级页面传参

Flutter中页面通过路由跳转传参主要分两种,一种是通过push()跳转时根据设定的参数进行传参,另一种是通过pop()返回时进行传参。

父级页面向子页面push()传参

假设从A页面跳到B页面可能需要携带参数userName和userAge这两个参数,那么需要在B页面先设置这两个参数名;假设userName必须填而userAge非必需,那么可以通过设置@required其为必填选项:

class PageB extends StatefulWidget {
  @override
  final userName;
  final userAge;
  const PageB({Key key,@required this.userName,this.userAge}) : super(key: key);
  _PageBState createState() => _PageBState();
}

  

在A页面进行传参:

Navigator.push(context, new MaterialPageRoute(builder: (BuildContext context){
  return PageB(
    userName: ‘灭霸‘,
    userAge: ‘18岁‘,
  );
}));

  

子页面向父级页面pop()传参

pop()传参是当页面B返回到页面A时,页面A通过.then()接收:

Navigator.push(context, new MaterialPageRoute(builder: (BuildContext context){
  return PageB(
    userName: ‘灭霸‘,
    userAge: ‘18岁‘,
  );
})).then((userInfo){
  setState(() {
    backResult = userInfo;
  });
});

  

在B页面中直接把需要传的参数放入pop()中即可:

String userInfo = ‘对不起,用户灭霸已阵亡!‘;
Navigator.of(context).pop(userInfo);

  

此时,我们已经完成了两边页面之间的一个交互,看一下最终效果:

最后附上A、B页面源码

pageA页面

import ‘package:flutter/material.dart‘;
import ‘package:test_app/page_b.dart‘;

class PageA extends StatefulWidget {
  @override
  _PageAState createState() => _PageAState();
}

class _PageAState extends State<PageA> {
  String backResult;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(‘pageA‘,style: TextStyle(color: Colors.white,fontSize: 20),),
      ),
      body: Container(
        alignment: Alignment.center,
        child: Column(
          children: <Widget>[
            RaisedButton(
            child: Text(‘点击跳转B页面并传输用户信息‘),
            onPressed: (){
              Navigator.push(context, new MaterialPageRoute(builder: (BuildContext context){
                return PageB(
                  userName: ‘灭霸‘,
                  userAge: ‘18岁‘,
                );
              })).then((userInfo){
                setState(() {
                  backResult = userInfo;
                });
              });
            }),
            Text(‘${backResult}‘),
          ],
        ),
      ),
    );
  }

}

  

pageB页面

import ‘package:flutter/material.dart‘;

class PageB extends StatefulWidget {
  @override
  final userName;
  final userAge;
  const PageB({Key key,@required this.userName,this.userAge}) : super(key: key);
  _PageBState createState() => _PageBState();
}

class _PageBState extends State<PageB> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(‘pageB‘,style: TextStyle(color: Colors.white,fontSize: 20),),
      ),
      body: Container(
        alignment: Alignment.center,
        child: Column(
          children: <Widget>[
            Text(‘用户名字:${widget.userName}‘),
            Text(‘用户年龄:${widget.userAge}‘),
            RaisedButton(
            child: Text(‘返回页面A并通知灭霸阵亡消息‘),
            onPressed: (){
              String userInfo = ‘对不起,用户灭霸已阵亡!‘;
              Navigator.of(context).pop(userInfo);
            }),
          ],
        ),
      ),
    );
  }

}

  

原文地址:https://www.cnblogs.com/gxsyj/p/11024726.html

时间: 2024-11-07 04:22:24

Flutter路由跳转父级页面向子页面传参及子页面向父级页面传参的相关文章

keep-alive 路由跳转后不刷新页面

使用keep-alive记住了状态 通过路由跳转并且携带了参数,之前this.$route.params.list卸载mounted中,第一次进入能够更新,但是后面再次进入就不会更新了. 借用别人的话 当引入keep-alive 的时候,页面第一次进入,钩子的触发顺序created-> mounted-> activated,退出时触发deactivated.当再次进入(前进或者后退)时,只触发activated. 所以将方法写在 activated中

2种方式解决vue路由跳转未匹配相应路由避免出现空白页面或者指定404页面

https://www.cnblogs.com/goloving/p/9254084.html https://www.cnblogs.com/goloving/p/9254084.html 1.路由全局守卫 在做项目的时候,遇到需要做路由跳转,但当用户输入错误url地址,或是其它非法url路由地址,我们或许会想到跳转至404页面.不管你有没有写一个404页面,当出现未匹配路由都需重新指定页面跳转.可能大家首先想到会是路由重定向,redirect来解决这个问题.但实际上通过redirect是没办

vue,下级页面刷新导致路由跳转带过来的数据消失的解决方法

if(typeof(this.$route.query.result)=='string'){ //刷新时走这 }else{ //正常路由跳转过来后就把数据塞到 localStorage let obj = JSON.stringify(this.$route.query); //转化为JSON字符串 localStorage.setItem("prizeResult", obj); //数据存storage,防止刷新丢失 } 去localStorage取 let result = J

VueJs路由跳转——vue-router的使用

对于单页应用,官方提供了vue-router进行路由跳转的处理,本篇主要也是基于其官方文档写作而成. 安装 基于传统,我更喜欢采用npm包的形式进行安装. npm install vue-router --save 当然,官方采用了多种方式进行安装,包括bower,cdn等. 基本用法 在HTML文档中使用,只需要利用v-link这个directive就行了,如: <a v-link="{path: '/view-a'}">Go to view-a</a> ?

Vue之路由跳转传参,插件安装与配置

路由跳转 this.$router.push('/course'); this.$router.push({name:course}); this.$router.go(-1); //后退一页 this.$router.go(1): // 前进一页 <router-link to = "/course">课程页</router-link> <router-link :to="{name:'course'}"> 课程页 </r

vue路由跳转时判断用户是否登录功能

通过判断该用户是否登录过,如果没有登录则跳转到login登录路由,如果登录则正常跳转. 一丶首先在用户登录前后分别给出一个状态来标识此用户是否登录(建议用vuex): 简单用vuex表示一下,不会可以自己去官网多看看: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex); var state = { isLogin:0, //初始时候给一个 isLogin=0 表示用户未登录 }; const mutations = { cha

React-Router路由跳转时render触发两次的情况。

问题:React-Router路由跳转时,render触发两次,导致页面重复渲染. 原因:项目中使用的react-router ^3.x.x.react-router路由跳转时,this.props.location.action的值会有两种状态.这两种状态都会触发render.故页面渲染两次.   1.当点击Link时,this.props.location.action=PUSH,2.当浏览器前进后退时,this.props.location.action=POP.   所以当点击了Link

Vue路由跳转问题记录

最近项目上需要用Vue用来做app,在Vue中使用路由时遇到下面的问题. 路由设置如下: { path:'/tab', component:Tab, children:[{ path:'layoutList', name:'LayoutList', component:LayoutList },{ path:'layoutView/:layoutId', name:'LayoutView', component:LayoutView },{ path:'layoutDetail/:viewId'

[email&#160;protected]登录页通过路由跳转到内页的demo

今天还是来说一下angular中的路由模块.我们实际项目中,各个页面的切换是经常会与Auth相关的.比如我网站的后台,是需要登录过的用户才能进去,那么我们用angularJS做前端路由的时候应该怎么完成这个功能呢 ------------------------------------------------------------------------ 我们还是先设想一个最简单的场景吧.我们的应用有两个页面,登录页面后内容页面,要求是必须要验证登录成功后才能进入内容页面,下面我们一起来实现一