IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Flutter基础(一)页面跳转 -> 正文阅读

[移动开发]Flutter基础(一)页面跳转

一、介绍

在安卓里,界面(Activity)的跳转是通过startActivity来完成。而在Flutter里,把界面称作为一个个Route,他们的跳转是通过一个叫做路由管理(Navigator)的工具,负责页面之前的跳转,包括参数的传递接受和返回。Navigator的方法总的来说就两个,push(进栈),pop(出栈),跟Activity一样也会生成一个存放页面的栈。

二、页面跳转

首先,我们创建一个新的页面,如下

class TwoPageRoute extends StatelessWidget {
  const TwoPageRoute({Key? key,}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("第二个页面"),
      ),
    );
  }
}
2.1 普通跳转

可以看到,在界面添加了跳转到TwoPageRoute页面的按钮。

TextButton(
  child: const Text("通过实例跳转"),
  onPressed: ()  {
   Navigator.push(context,
        MaterialPageRoute(builder: (context) {
      return const TwoPageRoute();
    }));
  },
)

**提示1:**关于MaterialPageRoute可以理解为对路由界面的一个封装,继承于PageRoute,定义了页面之前跳转的动画,可以针对不同平台,实现与平台页面切换动画风格一致的路由切换动画。

**提示2:**在Flutter中,如果代码是固定的,也就是写死的,编译器会建议加上const。如果你是通过值传递的,那自然就不能加const了。

2.2 参数跳转

界面的跳转中,经常都需要传递参数。下面我们传递一个String参数和一个Bean类

UserBean类

class UserBean{
   String name;
   int age;
   UserBean(this.name, this.age);
}

修改TwoPageRoute页面,增加两个参数,text和userBean。可以看到,在他们前面有个required关键字,意思是必传,这在很多Widget都会见到。

class TwoPageRoute extends StatelessWidget {
  const TwoPageRoute({Key? key,
    required this.text, // 接收一个text参数
    required this.userBean //接收一个userBean类
  }) : super(key: key);
  final String text;
  final UserBean userBean;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("第二个页面"),
      ),
      body: Center(
        child: Column(
          children: [
            Text("接受text值:$text"),
            Text("接受userBean值:${userBean.toString()}"),
          ],
        ),
      ),
    );
  }
}

修改TextButton中的传参

TextButton(
  child: const Text("通过实例跳转"),
  onPressed: ()  {
   Navigator.push(context,
        MaterialPageRoute(builder: (context) {
      return TwoPageRoute(
          text: "我是第一个页面", userBean: UserBean("小小虫", 18));
    }));
  },
)
2.2 接收参数返回

在Flutter,接受页面的返回参数,相比安卓会比较方便,如下:

TextButton(
  child: const Text("通过实例跳转"),
  onPressed: () async {
    var result = await Navigator.push(context,
        MaterialPageRoute(builder: (context) {
      return TwoPageRoute(
          text: "我是第一个页面", userBean: UserBean("小小虫", 18));
    }));
    print("路由返回值: $result");
  },
)

修改TwoPageRoute页面,添加一个按钮返回参数

TextButton(
    onPressed: () {
      Navigator.pop(context, "我是返回值");
    },
    child: const Text("关闭页面并返回值")
)

**注意1:**关键词async和await,不然不会等待页面结束接受返回值。关键词async和await,不然不会等待页面结束接受返回值。

三、路由命名跳转

? 在Flutter中,页面的跳转除了通过上面的方法外,还有一种通过路由命名跳转,类似于安卓的隐式跳转,安卓的如下:

<action android:name="com.example.SplashActivity" />

而在Flutter中,需要在MyApp中添加routes参数,如下:

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
      //注册路由表
      routes: {
        "custom_page": (context) =>  const CustomRoute(),
      },
    );
  }
}

增加一个TextButton,可以看到,路由命名的跳转需要通过pushNamed方法,支持arguments传参,是不是很熟悉的样子👀

TextButton(
  child: const Text("通过自定义命名路由跳转"),
  onPressed: () async {
    var result = await Navigator.pushNamed(context, "custom_page",
        arguments: "hello,我是通过自定义命名路由跳转");
    print("通过自定义命名路由跳转路由返回值: $result");
  },
)

然后修改CustomRoute页面,在build中获取参数,如下:

@override
Widget build(BuildContext context) {
  //获取路由参数
  var args=ModalRoute.of(context)?.settings.arguments;
  }

如果你想两种结合在一起,把TwoPageRoute也加到routes中,还是最好不要吧🤣

修改routes,增加two_page_route

routes: {
  "two_page_route": (context) {
    dynamic obj =  ModalRoute.of(context)!.settings.arguments;
    return TwoPageRoute(text: obj["text"],userBean:obj["user"] ,);
  },
}

修改参数,flutter的arguments的类型真的是很百变👍,感觉出问题的几率也会很高。

TextButton(
  child: const Text("通过自定义命名路由跳转"),
  onPressed: () async {
    var result = await Navigator.pushNamed(context, "two_page_route",
        arguments: <String, Object>{
          'text': '我是第一个页面',
          'user': UserBean("小小虫", 181),
        });
    print("通过自定义命名路由跳转路由返回值: $result");
  },
)

四、路由钩子

? 所谓的路由钩子,其实就是一些路由相关的监听方法(监听就监听,还钩子)。

例如:

  • onGenerateRoute:通过命名路由打开是会被调用。注意!重点!重点!是对应的name没有在routes中有映射关系,那么就会执行onGenerateRoute钩子函数,也就是没有在routes中注册路由。
  • onUnknowRoute:在打开一个不存在的命名路由时会被调用
  • navigatorObservers:监听所有路由跳转动作

举几个栗子

onGenerateRoute使用,在MaterialApp中添加onGenerateRoute,如下:

@override
  Widget build(BuildContext context) {
    return MaterialApp(
      onGenerateRoute: (RouteSettings settings) {
        var routeName = settings.name;
        var isLogin = true;
        if(routeName == "two_page_route" && isLogin){
          return MaterialPageRoute(builder: (context) {
            return TwoPageRoute(text: "我是第一个页面", userBean: UserBean("小小虫", 18));
          });
        }else{
          //登录逻辑。。。
        }
      },
    );
  }
}

**注意:**记得先把two_page_route从routes去掉!

navigatorObservers使用,在MaterialApp中添加navigatorObservers,如下:

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      //监听所有路由跳转动作,
      navigatorObservers: [
        MyNavigator()
      ],
    );
  }

新建一个MyNavigator类,如下:

import 'package:flutter/widgets.dart';

///导航栈的变化监听
class MyNavigator extends NavigatorObserver{
  @override
  void didPush(Route route, Route? previousRoute) {
    super.didPush(route, previousRoute);
	//监听每个路由进栈
  }

  @override
  void didPop(Route route, Route? previousRoute) {
    super.didPop(route, previousRoute);
    //监听每个路由出栈
  }
}
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 18:36:39  更:2022-03-30 18:41:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 19:30:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码