androidstuio实现页面跳转_如何在 Flutter 中实现两个页面间的跳转

a1a283cf2608e89ef86de5cb7d8cc541.png

我们通常会用“屏”来表示应用的不同页面(界面)。比如,某个应用有一“屏”展示商品列表,当用户点击某个商品的图片,会跳到新的一“屏”展示商品的详细信息。

提示:在 Flutter 中,屏 (screen) 和 页面 (page) 都叫做 路由 (route),在下文中统称为“路由 (route)”。

59d7fb53b9a7cfc0eb7ce9b5e7cb288d.gif

在 Android 开发中,Activity 相当于“路由”,在 iOS 开发中,ViewController 相当于“路由”。在 Flutter 中,“路由”也是一个 widget。

怎么样从一个“路由”跳转到新的“路由“呢?你需要使用 Navigator 类。

步骤

下面来展示如何,总共分三步:

1. 创建两个路由 2. 用 Navigator.push() 跳转到第二个路由 3. 用 Navigator.pop() 回退到第一个路由

1. 创建两个路由

首先,我们来创建两个路由。这是个最简单的例子,每个路由只包含一个按钮。点击第一个路由上的按钮会跳转到第二个路由,点击第二个路由上的按钮,会回退到第一个路由。

首先来编写界面布局代码:

class FirstRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First Route'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Open route'),
          onPressed: () {
            // Navigate to second route when tapped.
          },
        ),
      ),
    );
  }
}

class SecondRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Route"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            // Navigate back to first route when tapped.
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}

2. 用 Navigator.push() 跳转到第二个路由

使用  Navigator.push() 方法跳转到新的路由。 push()  方法会添加一个  Route  对象到导航器的堆栈上。 那么这个  Route  对象是从哪里来的呢? 你可以自己实现一个,或者直接使用  MaterialPageRoute  类。 使用  MaterialPageRoute  是非常方便的,框架已经为我们实现了和平台原生类似的切换动画。 在  FirstRoute  widget 的  build()  方法中,我们来修改  onPressed()  回调函数:
// 位于 FirstRoute widget (Within the `FirstRoute` widget)
onPressed: () {
  Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SecondRoute()),
  );
}
3. 用 Navigator.pop() 回退到第一个路由 怎么关闭第二个路由回退到第一个呢? 使用  Navigator.pop()  方法, pop()  方法会从导航器堆栈上移除  Route  对象。 我们来修改  SecondRoute  widget 的  onPressed()  回调函数,实现返回第一个路由的功能:
// 位于 SecondRoute widget (Within the SecondRoute widget)
onPressed: () {
  Navigator.pop(context);
}
完整样例
import 'package:flutter/material.dart';

void main() {
  runApp(MaterialApp(
    title: 'Navigation Basics',
    home: FirstRoute(),
  ));
}

class FirstRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('First Route'),
      ),
      body: Center(
        child: RaisedButton(
          child: Text('Open route'),
          onPressed: () {
            Navigator.push(
              context,
              MaterialPageRoute(builder: (context) => SecondRoute()),
            );
          },
        ),
      ),
    );
  }
}

class SecondRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Second Route"),
      ),
      body: Center(
        child: RaisedButton(
          onPressed: () {
            Navigator.pop(context);
          },
          child: Text('Go back!'),
        ),
      ),
    );
  }
}
87ace380d46a8e1db4be2ca5416c83f4.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值