美文网首页Flutter学习
Flutter路由导航传递参数

Flutter路由导航传递参数

作者: zqyadam | 来源:发表于2019-04-21 13:23 被阅读0次

描述

一个列表页面,点击每个列表项进入不同的详情页面,并将列表的信息(标题和描述)传递过去

列表页面及详情页面

列表页面
详情页面

代码

主页面

// main.dart
import 'package:flutter/material.dart';
import 'ProductDetailPage.dart';
import 'ProductListPage.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Material App',
      home: ProductListView(),
      // 使用Navigator.push时,不需要下面的路由表
      routes: <String, WidgetBuilder>{
        'list': (BuildContext context) => ProductListView(),
        'detail': (BuildContext context) => ProductDetailPage(),
      },
    );
  }
}

列表页面

// ProductListPage.dart
import 'package:flutter/material.dart';
import 'Model/ProductClass.dart';
import 'ProductDetailPagePushNamed.dart';
import 'ProductDetailPagePush.dart' as ProductPush;

class ProductListView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('商品列表'),
      ),
      body: ProductList(
        products: List.generate(100, (index) {
          return Product('商品$index', '这是一个商品$index');
        }),
      ),
    );
  }
}

class ProductList extends StatelessWidget {
  final List<Product> products;
  ProductList({Key key, @required this.products}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ListView.builder(
      itemCount: products.length,
      itemBuilder: (context, index) {
        return ListTile(
          title: Text(products[index].name),
          subtitle: Text(products[index].description),
          onTap: () {
            /* using pushNamed */
            Navigator.pushNamed(context, 'detail', arguments: products[index]);
            /* using push */
/*             Navigator.push(context, MaterialPageRoute(
              builder: (context)=>ProductPush.ProductDetailPage(product:products[index]),
            ));
 */          },
        );
      },
    );
  }
}

详情页面

1)使用Navigator.pushNamed方法

使用Navigator.pushNamed方法首先需要在MaterialApp中定义routes

参数传递参看:https://flutter.dev/docs/cookbook/navigation/navigate-with-arguments

// ProductDetailPagePushNamed.dart
import 'package:flutter/material.dart';
import 'Model/ProductClass.dart';

class ProductDetailPage extends StatelessWidget {

  @override
  Widget build(BuildContext context) {
    /* 接收参数 */
    final Product product = ModalRoute.of(context).settings.arguments;
    return Scaffold(
      appBar: AppBar(
        title: Text(product.name),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Text(product.description),
            RaisedButton(
              child: Text('返回'),
              onPressed: () {
                Navigator.pop(context);
              },
            )
          ],
        ),
      ),
    );
  }
}

这里涉及到ModalRoute.of方法,具体可以参看https://api.flutter.dev/flutter/widgets/ModalRoute/of.html

2)使用Navigator.push方法

// ProductDetailPagePush.dart
import 'package:flutter/material.dart';
import 'Model/ProductClass.dart';

class ProductDetailPage extends StatelessWidget {
  /* 接收参数 */
  final Product product;
  ProductDetailPage({Key key, @required this.product}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(product.name),
      ),
      body: Center(
        child: Column(
          children: <Widget>[
            Text(product.description),
            RaisedButton(
              child: Text('返回'),
              onPressed: () {
                Navigator.pop(context);
              },
            )
          ],
        ),
      ),
    );
  }
}

使用Navigator.push接收参数的重点在构造函数,通过在构造函数中接受参数进行传递

final Product product;
ProductDetailPage({Key key, @required this.product}) : super(key: key);

数据模型

// Model/ProductClass.dart
class Product {
  final String name;
  final String description;
  Product(this.name, this.description);
}

相关文章

  • React native数据通信

    导航器传递参数给路由往导航栏传递参数RN与原生模块通信 导航器传递参数给路由 示例:同导航器内的TestScree...

  • Flutter路由导航传递参数

    描述 一个列表页面,点击每个列表项进入不同的详情页面,并将列表的信息(标题和描述)传递过去 列表页面及详情页面 代...

  • Flutter之旅:路由导航

    这章来聊聊flutter的路由管理,也可以理解为页面导航,用来处理页面之间的跳转、参数传递、动画展示等功能。 路由...

  • Flutter 路由动画跳转

    Flutter路由介绍 Flutter里面有路由支持所有的路由场景,push、pop页面,页面间的参数传递等等。f...

  • 路由配置中name的作用

    1.在router-link中使用name导航到对应路由 2.使用name导航的同时,给子路由传递参数

  • VUE Router使用实例

    子路由规则 通过url传递参数 路由跳转方式 1、声明式导航:

  • Flutter 路由传入中文参数报错无法push问题

    flutter自带路由传递参数和使用第三方库fluro路由传递参数都可以通过一下方式解决问题 其中mapValue...

  • flutter04: 路由跳转

    路由分两种:静态路由和动态路由 Flutter里面有路由支持所有的路由场景,push、pop页面,页面间的参数传递...

  • Flutter Route 路由传递参数

    有两种方式可以进行路由跳转 第一种方式 在main.dart里面配置routes 通过pushNamed 传递参数...

  • Flutter 命名路由传递参数

    注册命名路由 跳转发送参数 接受数据

网友评论

    本文标题:Flutter路由导航传递参数

    本文链接:https://www.haomeiwen.com/subject/haodgqtx.html