Flutter实现页面跳转切换(路由)

在移动开发中页面跳转也被称为导航管理,也就是路由,在Flutter中是如何实现的呢

import 'package:flutter/material.dart';

///页面跳转
void main() => runApp(new FirstPage());

class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => new _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "第一个页面",
      home: Scaffold(
        appBar: AppBar(title: Text("第一个页面"),),
        body: RaisedButton(onPressed: () {
        ///路由跳转
          Navigator.push(context, MaterialPageRoute(builder: (_) {
            return new SecondPage();
          }));
        }, child: Text("点击跳转第二个页面"),),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "第二个页面",
      home: Scaffold(
        body: Text("第二个页面"),
      ),
    );
  }
}

按照上面的代码执行跳转会打印如下错误
在这里插入图片描述
以上错误出现在Navigator上

  • 第一种解决方式

context传入MaterialApp下的context即可,代码如下

import 'package:flutter/material.dart';

///页面跳转
void main() => runApp(new FirstPage());

class FirstPage extends StatefulWidget {
  @override
  _FirstPageState createState() => new _FirstPageState();
}

class _FirstPageState extends State<FirstPage> {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: "第一个页面",
      home: Builder(builder: buildScaffold), //Builder添加后才能跳转成功
    ); //MaterialApp
  }
}

///创建一个widget
Widget buildScaffold(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: Text("第一个页面"),),
    body: RaisedButton(onPressed: () {
      Navigator.push(context, MaterialPageRoute(builder: (_) {
        return new SecondPage();
      }));
    }, child: Text("点击跳转第二个页面"),),
  ); //Scaffo
}

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    ///无需指定MaterialApp,使用的是第一个页面的风格,可指定AppBar
    return Scaffold(
      appBar: AppBar(title: Text("第二个页面"),),
      body: Text("第二个页面"),
    );
  }
}

  • 第二种方式
    采用分离的方式,代码如下
import 'package:flutter/material.dart';

void main() => runApp(new PageOne());

class PageOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "页面一",
      home: new PageOneDetail(),
    );
  }
}

class PageOneDetail extends StatelessWidget {
  ///此处context为MaterialApp下的context
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("第一个页面"),),
      body: RaisedButton(onPressed: () {
        Navigator.push(context, MaterialPageRoute(builder: (_) {
          return PageTwo();
        }));
      }, child: Text("点我跳转"),),
    );
  }
}

class PageTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("第二个页面"),),
      body: Text("我是第二个页面"),
    );
  }
}
  • 第三种采用命名路由的方法
import 'package:flutter/material.dart';

void main() => runApp(new PageOne());

class PageOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "页面一",
      home: new PageOneDetail(),

      ///注册路由表
      routes: {
        /// '/'是特殊地址,第一个页面
        "/": (context) => PageOne(),
        "/pageTwo": (context) => PageTwo(),
      },
    );
  }
}

class PageOneDetail extends StatelessWidget {
  ///此处context为MaterialApp下的context
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("第一个页面"),),
      body: RaisedButton(onPressed: () {
        Navigator.pushNamed(context, "/pageTwo");
      }, child: Text("点我跳转"),),
    );
  }
}

class PageTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: AppBar(title: Text("第二个页面"),),
        body: RaisedButton(onPressed: () {
          //路由pop弹出
          Navigator.pop(context, "结束");
        }, child: Text("我是第二个页面"),)

    );
  }
}

上面的代码会报下面的错误
在这里插入图片描述
改成下面的代码即可

import 'package:flutter/material.dart';

void main() => runApp(new PageOne());

class PageOne extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: "页面一",

      ///该处需要去掉下面已经指定了第一个页面
//      home: new PageOneDetail(),

      ///注册路由表
      routes: {
        /// '/'是特殊地址,第一个页面
        "/": (context) => PageOneDetail(),
        "/pageTwo": (context) => PageTwo(),
      },
    );
  }
}

class PageOneDetail extends StatelessWidget {
  ///此处context为MaterialApp下的context
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(title: Text("第一个页面"),),
      body: RaisedButton(onPressed: () async {
        ///获取第二个页面返回的数据 相当于Activity 的onActivityResult
        var pushNamed = await Navigator.pushNamed(context, "/pageTwo");
        debugPrint(pushNamed);
      }, child: Text("点我跳转"),),
    );
  }
}

class PageTwo extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
        appBar: AppBar(title: Text("第二个页面"),),
        body: RaisedButton(onPressed: () {
          //路由pop弹出,结束页面
          Navigator.pop(context, "结束返回");
        }, child: Text("我是第二个页面"),)

    );
  }
}


    

项目地址https://github.com/shunplus/flutter_xu

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Flutter中,切换页面通常使用Navigator类来实现。要切换页面,可以采用以下几种方法: 1. 使用Navigator.push方法切换页面:通过Navigator.push方法,将目标页面路由添加到当前页面的页面堆栈中,实现页面切换。例如: ``` Navigator.push(context, MaterialPageRoute(builder: (context) => NextPage())); ``` 2. 使用Navigator.pop方法返回上一个页面:通过Navigator.pop方法,将当前页面从页面堆栈中弹出,返回上一个页面。例如,在目标页面中点击返回按钮: ``` onPressed: () { Navigator.pop(context); } ``` 3. 使用Navigator.pushReplacement方法替换当前页面:通过Navigator.pushReplacement方法,将新的页面替换当前页面,实现页面切换。例如,跳转到登录页面并替换当前页面: ``` Navigator.pushReplacement(context, MaterialPageRoute(builder: (context) => LoginPage())); ``` 4. 使用Navigator.pushNamed方法通过路由名称切换页面:通过在应用程序的根widget MaterialApp中定义路由表,在页面切换时使用Navigator.pushNamed方法根据路由名称切换页面。例如,在路由表中定义页面路由: ``` MaterialApp( routes: { '/': (context) => HomePage(), '/next': (context) => NextPage(), '/login': (context) => LoginPage(), }, ) ``` 然后可以通过Navigator.pushNamed方法切换页面: ``` Navigator.pushNamed(context, '/next'); ``` 这些是Flutter中常用的切换页面的方法,开发者可以根据应用程序的需求选择适合的方式来实现页面切换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shunsix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值