Flutter路由管理与Navigator基础使用

简介: Flutter的路由管理与Navigator基础使用

前言

咱们程序员最有B格的时候,无非是在小白面前敲着一行又一行的代码(记得换成黑色的背景,不要问为什么,一因为帅就完了),然后使屏幕浮现出炫酷的动画,这才是最有B格的时候,那普通人又看不懂咱的逻辑,对吧~在这里插入图片描述
无论是App还是Web又或者是桌面程序,每一处都有页面间的跳转 ,毕竟一个应用程序都包含多个页面,咱不能一直往下滑吧哈哈

在 Flutter 中,这些元素被称为路由(Route),它们由导航器(Navigator) 控件管理。导航器管理着路由对象的堆栈并提供管理堆栈的方法,如 Navigator.pushNavigator.pop,通过路由对象的进出栈来使用户从一个页面跳转到另一个页面。

详解图:

在这里插入图片描述

Navigator的职责是负责管理Route的,管理方式就是利用一个栈不停压入弹出,当然也可以直接替换其中某一个Route。而Route作为一个管理单元,主要负责创建对应的界面,响应Navigator压入路由和弹出路由。
Flutter定义路由的方式跟前端MVC框架是很相似的,你会看到有这种类似的:/home,/posts,/posts/:id等等,搞前端的同学应该想到熟悉。

本小节内容:

1.普通路由

2.Navigator

​ 1).Navigator.push()

​ 2).Navigator.pop()

3.路由表的管理

4.Navigator.pushNamed()

5.构造方法传值

6.路由传值

7.带数据返回

哎呀妈呀,这一节干货也太多了吧,这要个赞不过分吧,我不要下次一定!!
在这里插入图片描述

1.普通路由

Route:一个页面要想被路由统一管理,必须包装为一个Route

官方的说法很清晰:An abstraction for an entry managed by a Navigator.

但是Route是一个抽象类,所以它是不能实例化的.

2.Navigator

Navigator:是一个路由管理的组件,它提供了打开和退出路由页方法。Navigator通过一个栈来管理活动路由集合。通常当前屏幕显示的页面就是栈顶的路由。

官方解释:A widget that manages a set of child widgets with a stack discipline.

两个路由之间的跳转需要经历下面三个步骤

  1. 创建两个route
  2. Navigate到第二个route使用Navigator.push()
  3. 返回到第一个route使用Navigator.pop()

1).所以,让我们先来创建两个路由

在这里插入图片描述

class FirstRoute extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => FirstState()

}

class FirstState extends State<FirstRoute> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: MaterialButton(
          child: Text("点击跳转到第二个界面"),
          onPressed: () {
            ///处理点击事件
          },
        ),
      ),
    );
  }
}
class FirstRoute extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => FirstState();
}

class FirstState extends State<FirstRoute> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Column(
      children: [
          SizedBox(
          height: 320,
        ),
        Center(
          child: MaterialButton(
            child: Text("点击跳转到第一个界面"),
            onPressed: () {
              ///处理点击事件
            },
          ),
        ),
        Center(
          child: MaterialButton(
            child: Text("点击返回到第一个界面"),
            onPressed: () {
              ///处理点击事件
            },
          ),
        ),
      ],
    ));
  }
}

2).使用Navigator.push()来跳转页面

在FirstRoute组件中的onPressed方法中添加我们的Navigator

onPressed: () {
  ///处理点击事件
  Navigator.of(context)
      .push(MaterialPageRoute(builder: (context) => SecondRoute()));
},

注意:Navigator类中第一个参数为context的静态方法都对应一个Navigator的实例方法

Navigator.push(BuildContext context, Route route)
Navigator.of(context).push(Route route)

这两种写法是等价的

3).使用Navigator.pop()来返回上一个页面

我们使用Navigator.pop()来退出SecondRoute并回到FirstRoute,pop()方法回将当前路由从Route栈中移除

在返回按钮中写:

onPressed: () {
  ///处理返回点击事件
  Navigator.pop(context);
},

当然我们也可以在跳转到第一个界面的里面写Navigator.push,不过不推荐这样的写法,因为这样的话没有吧页面从栈中移除。

3.路由表的管理

如果我们的项目中出现了多次跳转到同一个页面的情况,这种方式会造成大量代码的重复,路由表就很好的解决了这个问题。

咋这么多路由呢,感觉在上路由交换的课程哈哈

定义路由表

在MaterialApp的构造方法中添加两个额外的属性:initialRouteroutes

return MaterialApp(
  title: 'Flutter Route',
  theme: ThemeData(
    primarySwatch: Colors.blue,
  ),
    // 定义APP启动时第一个显示的页面
    initialRoute: '/',
    routes: {
      // 当navigating到‘/’ route时,FirstRoute widget
      '/': (context) => FirstRoute(),
      // 当navigating 到"/second" route, SecondRoute widget.
      '/second': (context) => SecondRoute(),
    },
    ///指定了initialRoute,home就是多余的了
    //home: FirstRoute(),
);

路由表是给每个Route定义了一个名称,这样我们就可以根据这个名称来进行跳转了。

4.Navigator.pushNamed()

通过这个方法跳转时,Flutter会去定义的routes中转到名称所对应的route,并进行跳转。

onPressed: () {
  ///处理点击事件
  ///普通跳转
  // Navigator.of(context)
  //     .push(MaterialPageRoute(builder: (context) => SecondRoute()));
  ///通过路由表跳转
  Navigator.pushNamed(context, "/second");
},

5.构造方法传值

使用于普通跳转,在自定义封装或者写插件时经常会用到。

我们可以在SecondRoute中定义几个参数:

class SecondRoute extends StatefulWidget {
  final int age;
  final String name;

  const SecondRoute({Key key, this.age, this.name}) : super(key: key);

  @override
  State<StatefulWidget> createState() => SecondState();
}

通过构造方法获取参数

这下我们就可以在跳转时传参啦:

Navigator.of(context)
    .push(MaterialPageRoute(builder: (context) => SecondRoute(age: 20,name: "阿T",)));

使用传入的参数:

Text(
    "我的年龄:" + widget.age.toString() + " 我的姓名 " + widget.name)

在这里插入图片描述

6.路由传值

让我们先看看Navigator.pushNamed()的源码:

@optionalTypeArgs
  static Future<T> pushNamed<T extends Object>(
    BuildContext context,
    //路由路径
    String routeName, {
    //携带的参数
    Object arguments,
   }) {
    return Navigator.of(context).pushNamed<T>(routeName, arguments: arguments);
  }

arguments是跳转携带的参数,它是一个Object,意味着可以传递任意类型的参数。

1)多个数据时准备一个bean

class ScreenArguments {
  final String title;
  final String message;
   ScreenArguments(this.title, this.message);
}

2)跳转界面

Navigator.pushNamed(
      context,
      ExtractArgumentsScreen.routeName,
      arguments: ScreenArguments(
        'title',
        'message',
      )

3)获取参数

 final ScreenArguments args = ModalRoute.of(context).settings.arguments;

4)使用参数

Text(args.title),
 Text(args.message),

7.带数据返回

Navigator.pop(context, '返回的数据');

由于源码中 pop的方法是Object,这里可以传递任意类型参数返回

  @optionalTypeArgs
  static void pop<T extends Object>(BuildContext context, [ T result ]) {
    Navigator.of(context).pop<T>(result);
  }

基础路由就这样简单的实现啦
在这里插入图片描述
欢迎留言纠正 ~ 不妨给个点赞哈哈

相关文章
|
4天前
|
Go 网络架构 开发者
Flutter &鸿蒙next中的路由使用详解【基础使用】
本文介绍了 Flutter 路由系统的使用方法,包括基本路由、命名路由、参数传递、返回参数和动态路由。通过 `Navigator` 类实现页面跳转,支持简单和复杂参数的传递,并可通过 `onGenerateRoute` 实现更灵活的动态路由管理。示例代码展示了如何在实际项目中应用这些技术,帮助开发者构建清晰、易于维护的导航结构。
59 1
|
22天前
|
UED 开发者
flutter:获取对象&路由管理 (四)
本文介绍了Flutter中如何通过Context获取状态对象、使用GlobalKey获取状态对象、基本的路由管理、路由传值、命名路由、返回根路由以及点击图标跳转的方法。示例代码展示了如何在应用中实现这些功能,包括页面跳转、传递参数和返回上一页等操作。
|
4月前
|
容器
flutter 布局管理【详解】
flutter 布局管理【详解】
37 3
|
4月前
|
Android开发
Flutter路由跳转参数处理小技巧
Flutter路由跳转参数处理小技巧
41 0
|
4月前
flutter的状态管理学习
flutter的状态管理学习
|
6月前
|
前端开发 开发者 UED
【Flutter前端技术开发专栏】Flutter中的图标、字体与样式管理
【4月更文挑战第30天】本文介绍了在Flutter中管理图标、字体和样式的做法。Flutter提供`Icons`类用于内置矢量图标,支持第三方图标库如FontAwesome。自定义字体可通过添加字体文件至`assets`目录并配置`pubspec.yaml`,然后使用`TextStyle`设置。借助`ThemeData`,开发者能统一管理应用主题样式,局部样式可覆盖全局。通过集中管理样式,提升代码复用性和应用一致性。
166 0
【Flutter前端技术开发专栏】Flutter中的图标、字体与样式管理
|
6月前
|
存储 JavaScript 前端开发
【Flutter 前端技术开发专栏】Flutter 中的状态管理框架(如 Provider、Redux 等)
【4月更文挑战第30天】本文探讨了 Flutter 开发中的状态管理,重点介绍了 Provider 和 Redux 两种框架。Provider 以其简单易用性适合初学者和小项目,而 Redux 则适用于大型复杂应用,保证状态一致性。此外,还提到了 Riverpod 和 BLoC 等其他框架。选择框架时要考虑项目规模、团队技术水平和个人偏好。文章通过购物车应用示例展示了不同框架的使用,并展望了状态管理框架的未来发展。
163 0
【Flutter 前端技术开发专栏】Flutter 中的状态管理框架(如 Provider、Redux 等)
|
6月前
|
JavaScript 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
【4月更文挑战第30天】本文探讨了Flutter的Widget和状态管理。Widget是Flutter构建UI的基础,分为有状态和无状态两种。状态管理确保UI随应用状态变化更新,影响应用性能和可维护性。文章介绍了`setState`、`Provider`、`Riverpod`、`Bloc`和`Redux`等状态管理方法,并通过计数器应用展示了其实现。选择合适的状态管理策略对高效开发至关重要。
83 0
【Flutter前端技术开发专栏】Flutter中的Widget与状态管理
带你读《Flutter技术入门与实战》之二:Flutter基础知识
本书的定位适合小白程序员,入门加实战,既有基础知识,又有丰富示例,包括详细的操作步骤,实操性强。由于Flutter大量使用组件,所以对组件的讲解很详细,包括基本概念、属性及代码示例。每个组件都配有小例子,力求精简,还提供了配套网站提供完整代码,复制完整代码就可以立即看到效果。在轻松掌握基础知识的同时快速进入实战。
|
28天前
|
Android开发 iOS开发 容器
鸿蒙harmonyos next flutter混合开发之开发FFI plugin
鸿蒙harmonyos next flutter混合开发之开发FFI plugin