(译)发送数据到新路由

栏目: ASP.NET · 发布时间: 5年前

内容简介:通常,我们不仅要导航到新路由,还要将一些数据传递到路由。例如,我们经常希望传递有关我们所使用的项目的信息。请记住:多个路由仅仅是多个Widget。在这个例子中,我们将创建一个Todos列表。当点击待办事项时,我们将导航到显示有关待办事项信息的新路由(widget)。

原文地址

通常,我们不仅要导航到新路由,还要将一些数据传递到路由。例如,我们经常希望传递有关我们所使用的项目的信息。

请记住:多个路由仅仅是多个Widget。在这个例子中,我们将创建一个Todos列表。当点击待办事项时,我们将导航到显示有关待办事项信息的新路由(widget)。

步骤

  1. 定义Todo类
  2. 显示待办事项列表
  3. 创建一个详细信息路由,可以显示有关待办事项的信息
  4. 导航并将数据传递到详细信息路由

1.定义Todo类

首先,我们需要一种简单的方式来表示Todo。对于此示例,我们将创建一个包含两个数据的类:标题和描述。

class Todo {
  final String title;
  final String description;

  Todo(this.title, this.description);
}

2.创建待办事项列表

其次,我们要显示Todo列表。在这个例子中,我们将生成20个待办事项并使用ListView显示它们。有关使用列表的更多信息,请参阅 基础列表 配方。

生成Todo列表

final todos = List<Todo>.generate(
  20,
  (i) => Todo(
        'Todo $i',
        'A description of what needs to be done for Todo $i',
      ),
);

使用ListView显示待办事项列表

ListView.builder(
  itemCount: todos.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(todos[index].title),
    );
  },
);

到现在为止还挺好。我们将生成20个Todos并在ListView中显示它们!

3.创建一个详细信息屏幕,可以显示有关待办事项的信息

现在,我们将创建第二个路由。路由标题将包含待办事项的标题,路由正文将显示说明。

由于它是一个普通的StatelessWidget,我们只需要创建Screen的用户传入Todo!然后,我们将使用给定的Todo构建UI。

class DetailScreen extends StatelessWidget {
  // Declare a field that holds the Todo
  final Todo todo;

  // In the constructor, require a Todo
  DetailScreen({Key key, @required this.todo}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // Use the Todo to create our UI
    return Scaffold(
      appBar: AppBar(
        title: Text(todo.title),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Text(todo.description),
      ),
    );
  }
}

4.导航并将数据传递到详细信息路由

随着我们的 DetailScreen 到位,我们已准备好执行导航!在我们的例子中,当用户点击列表中的Todo时,我们将要导航到 DetailScreen 。当我们这样做时,我们也想将Todo传递给DetailScreen。

为此,我们将为ListTile Widget编写onTap回调。在我们的onTap回调中,我们将再次使用Navigator.push方法。

ListView.builder(
  itemCount: todos.length,
  itemBuilder: (context, index) {
    return ListTile(
      title: Text(todos[index].title),
      // When a user taps on the ListTile, navigate to the DetailScreen.
      // Notice that we're not only creating a DetailScreen, we're
      // also passing the current todo to it!
      onTap: () {
        Navigator.push(
          context,
          MaterialPageRoute(
            builder: (context) => DetailScreen(todo: todos[index]),
          ),
        );
      },
    );
  },
);

完整例子

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class Todo {
  final String title;
  final String description;

  Todo(this.title, this.description);
}

void main() {
  runApp(MaterialApp(
    title: 'Passing Data',
    home: TodosScreen(
      todos: List.generate(
        20,
        (i) => Todo(
              'Todo $i',
              'A description of what needs to be done for Todo $i',
            ),
      ),
    ),
  ));
}

class TodosScreen extends StatelessWidget {
  final List<Todo> todos;

  TodosScreen({Key key, @required this.todos}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Todos'),
      ),
      body: ListView.builder(
        itemCount: todos.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(todos[index].title),
            // When a user taps on the ListTile, navigate to the DetailScreen.
            // Notice that we're not only creating a DetailScreen, we're
            // also passing the current todo through to it!
            onTap: () {
              Navigator.push(
                context,
                MaterialPageRoute(
                  builder: (context) => DetailScreen(todo: todos[index]),
                ),
              );
            },
          );
        },
      ),
    );
  }
}

class DetailScreen extends StatelessWidget {
  // Declare a field that holds the Todo
  final Todo todo;

  // In the constructor, require a Todo
  DetailScreen({Key key, @required this.todo}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    // Use the Todo to create our UI
    return Scaffold(
      appBar: AppBar(
        title: Text(todo.title),
      ),
      body: Padding(
        padding: EdgeInsets.all(16.0),
        child: Text(todo.description),
      ),
    );
  }
}

(译)发送数据到新路由


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

探索需求

探索需求

章柏幸、王媛媛、谢攀、杰拉尔德・温伯格、唐纳德・高斯 / 章柏幸、王媛媛、谢攀 / 清华大学出版社 / 2004-7-1 / 39.00元

本书将与您一起寻找"什么是客户真正想要的"这一问题的答案。 本书着眼于系统设计之前的需求过程,它是整个开发过程(如何设计人们想要的产品和系统)中最有挑战性的那部分。通过对一些需求分析中的常见误区和问题的分析和讨论,从和客户沟通开始,深入研究一些可能的需求,澄清用户和开发者期望值,最终给出了能够大幅度提高项目成功几率的一些建议方法。 本书由该领域内公认的两位作者合著,搜集了他们在大大小小......一起来看看 《探索需求》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具