前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Flutter 系列之GetX的学习(2) --> 路由导航

Flutter 系列之GetX的学习(2) --> 路由导航

作者头像
心安事随
发布2024-11-28 09:05:36
发布2024-11-28 09:05:36
24200
代码可运行
举报
文章被收录于专栏:前端大合集前端大合集
运行总次数:0
代码可运行

1. 前言

在上篇文章我们介绍一下getx的概念, 以及如何使用Getx创建我们的Controller控制器,,并且在UI部分进行控制器的实例化,使用GetBuilder进行状态的展示和更新.

那么在本小节我们将介绍Getx的另外一个功能 -->路由导航

2. 基本导航操作

我们新建一个页面, 并使用stl快速搭建出来article下的index.dart的页面模板

在index.dart文件开始输入s t l , 就可以快速填充模板, 类似html文件的!一样

image.png
image.png
代码语言:javascript
代码运行次数:0
复制
import 'package:flutter/material.dart';

class Article extends StatelessWidget {
  const Article({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('文章'),
        leading: IconButton(onPressed: () {}, icon: const Icon(Icons.arrow_back_ios)),
      ),
      body: const Center(
        child: Text('文章页面'),
      ),
    );
  }
}

紧接着我们需要在counter_screen 里面进行第二个按钮的事件绑定. 核心:Get.to(Article())

代码语言:javascript
代码运行次数:0
复制
  GestureDetector(onTap: () {Get.to(Article());}, child: _buildContainer("跳转文章页面")),

此时我们允许,并且点击, 不出意外的话还是出意外了

image.png
image.png

通过阅读报错,我们发现如果想使用这种路由,必须改变我们MaterialAppGetMaterialApp.然后就可以了进行跳转了

ezgif-1-d32dbe30d4.gif
ezgif-1-d32dbe30d4.gif

为了方便返回,我们在二级页面添加返回路由的处理

代码语言:javascript
代码运行次数:0
复制
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get/get_core/src/get_main.dart';

class Article extends StatelessWidget {
  const Article({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('文章'),
        leading: IconButton(
            onPressed: () { Get.back();},
            icon: const Icon(Icons.arrow_back_ios)),
      ),
      body: const Center(
        child: Text('文章页面'),
      ),
    );
  }
}

这样通过简单的几步我们就实现了 前进和回退

3. 命名路由

代码语言:javascript
代码运行次数:0
复制
Get.toNamed("/page2");

不过需要提前定义好路由关系表映射关系.

代码语言:javascript
代码运行次数:0
复制
class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      initialRoute: "/",
      getPages: [
            GetPage(name: "/", page: () => const Page1()),
            GetPage(name: "/page1", page: ()=> const Page1()),
            GetPage(name: "/page2", page: ()=> const Page2()),
            GetPage(name: "/page3", page: ()=> const Page3()),
            GetPage(name: "/page4", page: ()=> const Page4()),
      ];,
      title: 'Animated Notch Bottom Bar',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }
}

4. 未定义路由重定向

要处理到未定义路线的导航(404错误),可以在GetMaterialApp中定义unknownRoute页面。

代码语言:javascript
代码运行次数:0
复制
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      initialRoute: "/",
      // 路由映射表匹配不到就会走这个
      unknownRoute: GetPage(name: "/notfound", page: ()=> NotFound()), 
      getPages: [
            GetPage(name: "/", page: () => const Page1()),
            GetPage(name: "/page1", page: ()=> const Page1()),
            GetPage(name: "/page2", page: ()=> const Page2()),
            GetPage(name: "/page3", page: ()=> const Page3()),
            GetPage(name: "/page4", page: ()=> const Page4()),
      ];,
      title: 'Animated Notch Bottom Bar',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(),
    );
  }

5. 动态路由

定于一个动态路由 在路由映射表里面

代码语言:javascript
代码运行次数:0
复制
GetPage(name: '/profile/:userId', page: () => ProfilePage()),

路由跳转

代码语言:javascript
代码运行次数:0
复制
// 跳转到 profile 页面,并传递 userId 参数 
Get.toNamed('/profile/123');

获取路由参数

代码语言:javascript
代码运行次数:0
复制
// 获取动态路由参数 
var userId = Get.parameters['userId'];

6. 路由传参

支持通过 arguments 传递复杂的对象或数据。在跳转时,可以传递参数: 不限于字符串,一个Map,一个List,甚至一个类的实例

代码语言:javascript
代码运行次数:0
复制
Get.to(SecondPage(), arguments: {'id': 123});

在目标页面可以通过 Get.arguments 获取这些参数:

代码语言:javascript
代码运行次数:0
复制
var id = Get.arguments['id'];

也可以通过动态网页链接进行传递,就像web开发一样.

代码语言:javascript
代码运行次数:0
复制
Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo");

NextScreen页面 接收

代码语言:javascript
代码运行次数:0
复制
print(Get.parameters['id']);
// out: 354
print(Get.parameters['name']);
// out: Enzo

7. 路由过渡动画

GetX 提供了丰富的页面过渡效果,允许你为每个页面设置不同的过渡动画。例如,可以指定页面从下方滑入:

代码语言:javascript
代码运行次数:0
复制
Get.to(SecondPage(), transition: Transition.downToUp);

常用的过渡类型包括:

  • Transition.fade: 淡入淡出
  • Transition.zoom: 缩放效果
  • Transition.cupertino: 类似 iOS 的过渡效果

你还可以自定义页面过渡动画,满足不同的 UI 需求。

8. 路由中间件

GetX 的路由支持中间件功能,允许在路由跳转之前进行拦截、验证或其他操作。常用于权限控制、重定向等场景。例如,可以创建一个简单的身份验证中间件:

代码语言:javascript
代码运行次数:0
复制
class AuthMiddleware extends GetMiddleware {
  @override
  RouteSettings? redirect(String? route) {
    if (!isLoggedIn) {
      return RouteSettings(name: '/login');
    }
    return null;
  }
}

然后在路由定义中使用中间件:

代码语言:javascript
代码运行次数:0
复制
GetPage(
  name: '/profile',
  page: () => ProfilePage(),
  middlewares: [AuthMiddleware()],
);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 前言
  • 2. 基本导航操作
  • 3. 命名路由
  • 4. 未定义路由重定向
  • 5. 动态路由
  • 6. 路由传参
  • 7. 路由过渡动画
  • 8. 路由中间件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档