Flutter路由

在Flutter中,路由管理主要有两个类:Route(一般用子类MaterialPageRoute)和Navigator

 Navigator

Navigator:管理所有的Route的Widget,通过一个Stack来进行管理的

  • 官方的说法也很清晰:A widget that manages a set of child widgets with a stack discipline.

那么我们开发中需要手动去创建一个Navigator吗?

  • 并不需要,我们开发中使用的MaterialApp、CupertinoApp、WidgetsApp它们默认是有插入Navigator的

  • 所以,我们在需要的时候,只需要直接使用即可

  • import 'package:flutter/material.dart';
    
    void main() {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: HomePage(),
        );
      }
    }
    
    class HomePage extends StatefulWidget {
      @override
      State<HomePage> createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      String _message='';
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Home Page'),
          ),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(_message),
              Center(
                child: ElevatedButton(
                  onPressed: () {
                    _jumpToDetail(context);
                  },
                  child: Text('Go to Second Page'),
                ),
              ),
            ],
          ),
        );
      }
      void _jumpToDetail(BuildContext context) {
        // 1.普通的跳转方式
        // 传递参数: 通过构造器直接传递即可
        Future result = Navigator.of(context).push(MaterialPageRoute(
            builder: (ctx) {
              return SecondPage("我是第一页传过来的数据");
            }
        ));
    
        // 2.获取结果
        result.then((res) {
          setState(() {
            _message = res;
          });
        });
      }
    }
    
    class SecondPage extends StatelessWidget {
    
      String s;
      SecondPage(this.s);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Second Page+$s'),
            leading: IconButton(//自定义一个箭头按键,返回一个空
              onPressed: (){
                Navigator.of(context).pop("");
              },
              icon: Icon(Icons.arrow_back),
            ),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () {
                //返回代码
                Navigator.of(context).pop("我是从第二页过来的数据");
              },
              child: Text('Go Back'),
            ),
          ),
        );
      }
    }

    通过命名路由routes

  • main.dart:
  • import 'package:flutter/material.dart';  
    import 'home_page.dart';  
    import 'second_page.dart';  
      
    void main() {  
      runApp(MyApp());  
    }  
      
    class MyApp extends StatelessWidget {  
      @override  
      Widget build(BuildContext context) {  
        return MaterialApp(  
          initialRoute: '/',  
          routes: {  
            '/': (context) => HomePage(),  
            '/second': (context) => SecondPage(),  
          },  
        );  
      }  
    }

    home_page.dart

  • import 'package:flutter/material.dart';
    class HomePage extends StatelessWidget {
      var receivedData;
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Home Page'),
          ),
          body: Center(
            child: ElevatedButton(
              onPressed: () async {
                receivedData = await Navigator.pushNamed(context, '/second', arguments: "从第一页传过来");
                if (receivedData != null) {
                  // 处理接收到的数据
                  print('接收到的数据:$receivedData');
                }
              },
              child: Text('Go to Second Page'),
            ),
          ),
        );
      }
    }

    second_page.dart

  • import 'package:flutter/material.dart';
    class SecondPage extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        //接收参数
        String receivedData = ModalRoute.of(context)?.settings.arguments as String;
        return Scaffold(
          appBar: AppBar(
            title: Text('Second Page'),
          ),
          body: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(receivedData),
              Center(
                child: ElevatedButton(
                  onPressed: () {
                    Navigator.pop(context ,"第二页面传来的数据");
                  },
                  child: Text('Go Back'),
                ),
              ),
            ],
          ),
        );
      }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值