7-flutter Navigator 和Route

本文详细介绍了在Flutter中如何使用Route和Navigator进行页面跳转,包括通过Navigator的push和pop方法实现页面间的跳转,以及如何使用MaterialPageRoute创建模态路由。此外,还讲解了如何在页面跳转时传递参数,并在目标页面处理这些参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Route 和 Navigator 用于页面之间的跳转

一 Navigator 的 push 和 pop 用于页面之间的跳转

创建MaterialApp时可以指定routes参数,该参数是一个映射路由名称和构造器的Map

跳转的时候 使用 push

跳回的时候使用 pop

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FirstPage(),
      routes: <String ,WidgetBuilder>{
        '/first':(BuildContext context) =>FirstPage(),
        '/second':(BuildContext context) =>SecondPage()
      },
    );
  }
}

// 第一个页面
class FirstPage extends StatelessWidget
{

  @override
  Widget build(BuildContext context) {
      return new Scaffold(
        appBar:new AppBar(title:new Text( "第一个页面")),
        body:new Center(
            child:new RaisedButton(
              child: new Text("点击打开第二个页面"),
              onPressed: (){
                Navigator.of(context).pushNamed('/second');
              },      
          ),
        ),
      );
  }

}

class SecondPage extends StatelessWidget
{
  
  @override
  Widget build(BuildContext context) {
      return new Scaffold(
        appBar:new AppBar(title:new Text( "第二个页面")),
        body:new Center(
            child:new RaisedButton(
              child: new Text("点击返回"),
              onPressed: (){
                 Navigator.of(context).pop();
              },      
          ),
        ),
      );
  }

}


二 第二种方式

直接使用MaterialPageRoute创建路由,它是一种模态路由,可以通过平台自适应的过渡效果来切换屏幕。默认情况下,当一个模态路由被另一个替换时,上一个路由将保留在内存中,如果想释放所有资源

onPressed: (){
    Navigator.push(context, 
    new MaterialPageRoute(builder: (context) => SecondPage()
    ));                  
}, 

三 示例操作 参数回调

第一个页面点击进去 第二个页面 点击喜欢与否 回传结果

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';

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

class MyApp extends StatelessWidget {
  // This widget is the root of your application.

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: NewTableList(),

    );
  }
}


class ContentPage extends StatelessWidget
{

  final HotNews news;
  ContentPage(this.news);

 
  @override
  Widget build(BuildContext context) {
      return new Scaffold(
        appBar:new AppBar(title:new Text(news.title)),
        body:new Padding( 
          padding: new EdgeInsets.all(25),
          child: new Column(
            children: <Widget>[
              new Text(news.content),
              new Row(
                  mainAxisAlignment: MainAxisAlignment.spaceAround,
                  children: <Widget>[
                    new RaisedButton(
                      onPressed: (){
                        // 点击的时候 回调用户的选择结果
                        Navigator.pop(context,'Good');
                      },
                      child: new Text("不错"),                      
                    ),
                    new RaisedButton(
                      onPressed: (){
                        // 点击的时候 回调用户的选择结果
                        Navigator.pop(context,'Bad');                       
                      },
                      child:new Text("差劲"),                      
                    )

                  ],
              )

            ],
          ),

        ),
      );
  }
}

// 创建一个新闻的类
class HotNews{
  String title;
  String content;

  HotNews({this.title,this.content});

}

// 创建列表
class NewTableList extends StatelessWidget
{
    final List<HotNews> arrs = new List.generate(20, 
        (idx) => new HotNews(
          title:'这是第 $idx 标题',
          content: '这是第 $idx 部分的正文',
        )
    ); 

    @override 
    Widget build(BuildContext context) {
      return new Scaffold(
          appBar: AppBar(title: Text("热点资讯")),
          body: new ListView.builder(
            itemCount: arrs.length,
            itemBuilder: (context,idx){
                return new ListTile(
                  title: new Text(arrs[idx].title),
                  // 添加一个点击事件
                  onTap: () async {

                    // 创建一个结果 结束用户的点击  
                    String readRes = await Navigator.push(context ,new MaterialPageRoute(
                      builder: (context) => new ContentPage(arrs[idx])));

                    // 显示回传的结果内容
                    if (readRes != null){
                      Scaffold.of(context).showSnackBar(
                        new SnackBar(
                          content: new Text("$readRes"),
                          duration: const Duration(seconds: 2),
                        )
                      );
                    }
                  },                  
                );
            },
          ),         
      );
    }


}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值