返回顶部
首页 > 资讯 > 精选 >Flutter如何创建一个内嵌的navigation
  • 282
分享到

Flutter如何创建一个内嵌的navigation

2023-07-05 12:07:41 282人浏览 薄情痞子
摘要

这篇文章主要讲解了“Flutter如何创建一个内嵌的navigation”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter如何创建一个内嵌的navigation”吧!简介我们在fl

这篇文章主要讲解了“Flutter如何创建一个内嵌的navigation”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter如何创建一个内嵌的navigation”吧!

简介

我们在flutter中可以使用Navigator.push或者Navigator.pushNamed方法来向Navigator中添加不同的页面,从而达到页面调整的目的。

一般情况下这样已经足够了,但是有时候我们有多个Navigator的情况下,上面的使用方式就不够用了。比如我们有一个主页面app的Navigator,然后里面有一个匹配好友的功能,这个功能有多个页面,因为匹配好友功能的多个页面实际上是一个完整的流程,所以这些页面需要被放在一个子Navigator中,并和主Navigator区分开。

那么应该如何处理呢?

搭建主Navigator

主Navigator是我们app的一些主要界面,这里我们有三个界面,分别是主home界面,一个setting配置界面和好友匹配界面。

其中好友匹配界面包含了三个子界面,这三个子界面将会用到子路由。

先来看下主路由,主路由的情况跟普通的路由没啥区别,这里我们首先定义和home和setting匹配的两个widget:HomePage和SettingsPage:

class HomePage extends StatelessWidget {  const HomePage({    super.key,  });  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: _buildAppBar(context),      body: Center(        child: Padding(          padding: const EdgeInsets.symmetric(horizontal: 24.0),          child: Column(            mainAxisSize: MainAxisSize.min,            children: const [              SizedBox(                width: 250,                height: 250,                child: Center(                  child: Icon(                    Icons.home,                    size: 175,                    color: Colors.blue,                  ),                ),              ),              SizedBox(height: 32),              Text(                '跳转到好友匹配页面',                textAlign: TextAlign.center,                style: TextStyle(                  fontSize: 24,                  fontWeight: FontWeight.bold,                ),              ),            ],          ),        ),      ),      floatingActionButton: FloatingActionButton(        onPressed: () {          Navigator.of(context).pushNamed(routeFriendMatch);        },        child: const Icon(Icons.add),      ),    );  }

HomePage很简单,它包含了一个floatingActionButton,当点击它的时候会调用 Navigator.pushNamed方法进行路由切换。

然后是SettingsPage,它是一个简单的Column:

class SettingsPage extends StatelessWidget {  const SettingsPage({    super.key,  });  @override  Widget build(BuildContext context) {    return Scaffold(      appBar: _buildAppBar(),      body: SingleChildScrollView(        child: Column(          mainAxisSize: MainAxisSize.min,          children: List.generate(8, (index) {            return  ListTile(              title: Text('设置项$index'),            );          }),        ),      ),    );  }

最后一个页面是FriendMatchFlow,这个页面比较复杂,我们在下一个再进行讲解。

然后我们为主路由在onGenerateRoute方法中进行定义:

void main() {  runApp(    MaterialApp(      onGenerateRoute: (settings) {        late Widget page;        if (settings.name == routeHome) {          page = const HomePage();        } else if (settings.name == routeSettings) {          page = const SettingsPage();        } else if (settings.name == routeFriendMatch) {          page = const FriendMatchFlow(            setupPageRoute: routeFriendMatchPage,          );        }        return MaterialPageRoute<dynamic>(          builder: (context) {            return page;          },          settings: settings,        );      },      debugShowCheckedModeBanner: false,    ),  );}

主路由很简单,跟普通的路由没有太多的区别。

构建子路由

接下来是构建子路由的步骤。在主路由中,如果路由的名称是routeFriendMatch,那么就会跳转到FriendMatchFlow。

而这个flow页面实际上是由几个子页面组成的:选择好友页面,等待页面,匹配页面和匹配完毕页面。

具体的页面代码这里就不写了,我们主要来讲一下子路由的使用。

对于FriendMatchFlow来说,它本身是一个Navigator,所以我们的build方法是这样的:

  Widget build(BuildContext context) {    return WillPopScope(      onWillPop: _isExitDesired,      child: Scaffold(        appBar: _buildFlowAppBar(),        body: Navigator(          key: _navigatorKey,          initialRoute: widget.setupPageRoute,          onGenerateRoute: _onGenerateRoute,        ),      ),    );  }

因为他需要根据用户的不同点击来进行内部路由的切换,所以需要保存对当前子Navigator的应用,所以这里FriendMatchFlow是一个StatefulWidget,并且上面的_navigatorKey是一个GlobalKey对象,以提供对子Navigator的引用:

  final _navigatorKey = GlobalKey<NavigatorState>();

这里的_onGenerateRoute方法,跟主路由也是很类似的,主要定义的是子路由中页面的跳转:

  Route _onGenerateRoute(RouteSettings settings) {    late Widget page;    switch (settings.name) {      case routeFriendMatchPage:        page = WaitingPage(          message: '匹配附近的好友...',          onWaitComplete: _onDiscoveryComplete,        );        break;      case routeFriendSelectPage:        page = SelectFriendPage(          onFriendSelected: _onFriendSelected,        );        break;      case routeFriendConnectingPage:        page = WaitingPage(          message: '匹配中...',          onWaitComplete: _onConnectionEstablished,        );        break;      case routeFriendFinishedPage:        page = FinishedPage(          onFinishPressed: _exitSetup,        );        break;    }

这里的on***Selected是VoidCallback回调,用来进行路由的切换:

  void _onDiscoveryComplete() {    _navigatorKey.currentState!.pushNamed(routeFriendSelectPage);  }  void _onFriendSelected(String deviceId) {    _navigatorKey.currentState!.pushNamed(routeFriendConnectingPage);  }  void _onConnectionEstablished() {    _navigatorKey.currentState!.pushNamed(routeFriendFinishedPage);  }

可以看到上面的路由切换实际上是在子路由上切换,跟父路由无关。

如果想要直接从子路由跳出到父路由该怎么处理呢?很简单,调用Navigator.of的pop方法即可:

  void _exitSetup() {    Navigator.of(context).pop();  }

这里的context默认是全局的context,所以会导致主路由的跳转变化。

感谢各位的阅读,以上就是“Flutter如何创建一个内嵌的navigation”的内容了,经过本文的学习后,相信大家对Flutter如何创建一个内嵌的navigation这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Flutter如何创建一个内嵌的navigation

本文链接: https://lsjlt.com/news/351528.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Flutter如何创建一个内嵌的navigation
    这篇文章主要讲解了“Flutter如何创建一个内嵌的navigation”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Flutter如何创建一个内嵌的navigation”吧!简介我们在fl...
    99+
    2023-07-05
  • Flutter学习之创建一个内嵌的navigation详解
    目录简介搭建主Navigator构建子路由总结简介 我们在flutter中可以使用Navigator.push或者Navigator.pushNamed方法来向Navigator中添...
    99+
    2023-03-13
    Flutter创建内嵌navigation Flutter 内嵌navigation Flutter navigation
  • jQuery如何创建一个嵌套的过滤器
    这篇文章给大家分享的是有关jQuery如何创建一个嵌套的过滤器的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建一个嵌套的过滤器.filter(":not(:has(.selected))")...
    99+
    2023-06-27
  • Flutter学习笔记(二)创建一个flutter项目
    目录开发环境实践运行网络环境配置(1)进入packages\flutter_tools\gradle 文件夹,然后打开flutter.gradle文件。目录如下图所示:(2)进入 f...
    99+
    2023-05-14
    Flutter学习 Flutter创建 创建flutter项目
  • Android Studio创建第一个Flutter项目
    一、创建Flutter项目 1.1 file->New–>New Flutter Project 1.2 配置Flutter SDK Path 1.3 填写项目相关信息 二、android st...
    99+
    2023-09-11
    flutter android studio android
  • 如何在 Go 中创建一个共享内存的 Goroutine?
    可以通过 channel 实现共享内存的 goroutine:创建一个 channel 以指定元素类型。启动一个 goroutine 向 channel 写入数据。在主 goroutin...
    99+
    2024-05-16
    共享内存
  • Flutter Future异步如何创建
    本篇内容介绍了“Flutter Future异步如何创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!异步futureFuture...
    99+
    2023-07-05
  • mysql如何创建一个表
    这篇文章给大家分享的是有关mysql如何创建一个表的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。1.登陆成功后,首先进入某一个数据库 (不是指数据库服务器)use t1; //...
    99+
    2024-04-02
  • 如何创建一个Ajax请求
    这篇文章给大家分享的是有关如何创建一个Ajax请求的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Ajax 是什么 如何创建一个 Ajax?我对 ajax 的理解是,它是一种异步通...
    99+
    2024-04-02
  • linux如何创建一个文件
    linux中创建一个文件需要使用“mkdir ”命令,方法步骤:1、打开linux终端;2、在命令行中输入“mkdir 文件名”命 令创建一个文件即可。具体操作步骤:在linux系统桌面中使用快捷键【Ctrl+Alt+T】打开终端命令行模式...
    99+
    2024-04-02
  • linux如何创建一个用户
    linux中创建一个用户的方法:1、打开终端;2、输入“su root”命令切换到管理员权限用户;3、输入“adduser 用户名 用户名”命令创建一个用户;4、创建后可输入“find / -name *username*”命令查看该用户是...
    99+
    2024-04-02
  • 如何创建一个spring项目
    如何创建一个spring项目?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。创建Spring项目通过spring.io生成初始代码,配置如下下载好会得到一个.zip文件,解压导入...
    99+
    2023-06-15
  • python如何创建一个枚举
    这篇文章主要介绍python如何创建一个枚举,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建一个枚举Enum是Python中用于创建枚举的类,枚举是附加到唯一,恒定值的一组符号名称。为了创建一个枚举,有必要创建一个...
    99+
    2023-06-27
  • PYTHON中如何创建一个类?
    可以使用 class 关键字来创建一个类: class MyClass: def __init__(self, arg1, arg2): self.arg1 = arg1 self.arg2 = arg2 ...
    99+
    2023-09-05
    python 开发语言
  • 如何创建一个小程序
    创建一个小程序可以分为以下几个步骤: 确定小程序的目的和功能:首先要明确小程序的目的是什么,以及它需要实现哪些功能。 设计小...
    99+
    2024-04-17
    小程序
  • mysql如何创建一个视图
    要创建一个视图,可以使用以下语法: CREATE VIEW view_name AS SELECT column1, col...
    99+
    2024-04-20
    mysql
  • 如何从另一个数组的扩展创建内联数组
    php小编柚子今天为大家介绍一种在PHP中创建内联数组的方法,即通过扩展另一个数组来快速构建。这种方法可以让我们更高效地创建和组织数组,提高代码的可读性和可维护性。本文将详细解释如何使...
    99+
    2024-02-10
  • 如何创建一个新的虚拟机
    创建一个新的虚拟机通常需要使用虚拟化软件,比如VMware、VirtualBox、Hyper-V等。以下是基本步骤: 下载并安装虚拟化软件,可以根据自己的需求选择合适的软件进行安装。 打开虚拟化软件,选择创建新的虚拟机的选项。 在创建虚拟...
    99+
    2024-06-10
    virtualbox
  • 如何创建一个创建MySQL数据库中的datetime类型
    目录一、domain用法及示例二、创建MySQL中datetime类型三、create type用法及示例环境系统平台:Microsoft Windows (64-bit) 10版本...
    99+
    2024-04-02
  • es6如何创建一个空对象
    这篇文章给大家分享的是有关es6如何创建一个空对象的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。创建一个空对象有时我们需要创建一个纯净的对象, 不包含什么原型链等等. 一般创建空...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作