Flutter开发之——getX-路由管理(04)

一 概述

  • 路由跳转(不使用named命名和使用named命名)
  • 路由跳转传值
  • 路由中间件Middleware
  • 路由嵌套导航

二 路由跳转(不使用named命名和使用named命名)

2.1 前提(GetMaterialApp取代MaterialApp)

GetMaterialApp( // Before: MaterialApp(
  home: MyHome(),
)

说明:

  • GetMaterialApp:GetX自带的MaterialApp,配置路由表,管理路由入栈、出栈等操作
  • MaterialApp:系统自带的MaterialApp,路由页面之间的操作通过Navigator操作,较为复杂

2.2 路由导航各种方式比较

系统自带(Navigator)
Navigator.of(context).push(
  context,
  MaterialPageRoute(
    builder: (BuildContext context) {
      return HomePage();
    },
  ),
);
GetX-navigator方式
navigator?.push(MaterialPageRoute(
      builder: (_){
        return Home();
      }
    ));
GetX-to方式
Get.to(Home());

2.3 路由跳转(不使用named命名)

  • Get.to(NextScreen()):跳转到新页面(新页面带导航按钮可返回)
  • Get.off(NextScreen()):跳转到新页面(上一个页面页面出栈,关闭上一个页面,没有返回按钮)
  • Get.offAll(NextScreen()):跳转到新页面,并关闭之前的所有页面(没有返回按钮)
  • Get.back():返回到上一个页面(对应于Get.to放到到路由页面跳转有效,off方法页面跳转无效)

2.4 路由跳转(使用named命名方式)

配置路由表(跳转前,路由页面先在getPages中配置好)
void main() => runApp(GetMaterialApp(
    initialRoute: '/',
    getPages: [
      GetPage(name: '/NextScreen', page: ()=>NextScreen()),
    ],
    home: Home()));
使用named命名方式路由跳转
  • Get.toNamed(“/NextScreen”):同Get.to(NextScreen())方式,跳转到新页面(新页面带导航按钮可返回)
  • Get.offNamed(“/NextScreen”):同Get.off(NextScreen()),跳转到新页面(上一个页面页面出栈,关闭上一个页面,没有返回按钮)
  • Get.offAllNamed(“/NextScreen”):同Get.offAll(NextScreen()),跳转到新页面,并关闭之前的所有页面(没有返回按钮)

2.5 未定义导航问题,比如404错误

1-在 GetMaterialApp 中定义一个 unknownRoute 页面

void main() => runApp(GetMaterialApp(
    unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()),
    initialRoute: '/',
    getPages: [
      GetPage(name: '/NextScreen', page: ()=>NextScreen()),
    ],
    home: Home()));

2- 通过named方式跳转时,路由出错时,跳转到UnknownRoutePage页面

levatedButton(child: Text("Error"), onPressed: () => Get.toNamed("/NextScreen1")),

说明:NextScreen1找不到此路径,出现问题时,交由UnknownRoutePage显示处理

三 路由跳转传值

3.1 传递值

  • 通过arguments方式指定

    Get.toNamed("/NextScreen", arguments: 'Get is the best');
    
  • 通过named方式,放在路由页面的后面用问号间隔开,比如

    Get.offAllNamed("/NextScreen?device=phone&id=354&name=Enzo");
    

3.2 接收值(controller/bloc/stateful/stateless都可以接受)

  • 通过arguments方式传递的,值接受方式

     var argument= Get.arguments;
    
  • 通过named方式传递的,值接受方式

     var device=Get.parameters['device'];
     var id=  Get.parameters['id'];
     var name= Get.parameters['name'];
    

四 路由中间件Middleware

4.1 什么是中间件Middleware

  • 设置路由监听,当路由事件触发时,调用routingCallback回调
  • routingCallback回调中,进行业务逻辑的处理

4.2 监听事件

void main() => runApp(GetMaterialApp(
    unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()),
    routingCallback: (routing) {
      if(routing?.current == '/second'){
        openAds();
      }
    },
    initialRoute: '/',
    getPages: [
      GetPage(name: '/NextScreen', page: ()=>NextScreen()),
      GetPage(name: '/second', page: ()=>Second())
    ],
    home: Home()));

void openAds()
{
  print('ads');
}

4.3 事件发生

ElevatedButton(child: Text("MiddleWare"), onPressed: () => Get.toNamed('/second')),

说明:使用Get.to(Second());方法时,注意Second的大小写

4.4 结果

事件被触发,ads被打印

五 路由嵌套导航

5.1 效果图

导航嵌套-1导航嵌套-2

5.2 导航嵌套代码

Navigator(
  key: Get.nestedKey(1), // create a key by index
  initialRoute: '/',
  onGenerateRoute: (settings) {
    if (settings.name == '/') {
      return GetPageRoute(
        page: () => Scaffold(
          appBar: AppBar(
            title: Text("Main"),
          ),
          body: Center(
            child: TextButton(
              color: Colors.blue,
              onPressed: () {
                Get.toNamed('/second', id:1); // navigate by your nested route by index
              },
              child: Text("Go to second"),
            ),
          ),
        ),
      );
    } else if (settings.name == '/second') {
      return GetPageRoute(
        page: () => Center(
          child: Scaffold(
            appBar: AppBar(
              title: Text("Main"),
            ),
            body: Center(
              child:  Text("second")
            ),
          ),
        ),
      );
    }
  }
),

六 参考

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 Flutter 的命令行工具清除 pub-cache。 在命令行/终端中输入以下命令: ``` flutter pub cache repair ``` 这将清除 pub-cache 中的所有内容,并重新下载所需的文件。 如果你想要更详细的控制,你可以手动删除 pub-cache 文件夹,它通常位于以下位置: - Windows:`%APPDATA%\Pub\Cache\bin` - Mac/Linux:`~/.pub-cache/bin` 然后在需要时,你可以在 Flutter 项目中运行 `flutter pub get` 来重新下载需要的依赖项。 ### 回答2: 在Flutter中,pub-cache是存储Flutter项目所需依赖包的地方。如果需要清除pub-cache中的内容,可以按照以下步骤进行操作: 1. 打开命令行终端(Command Prompt)或终端(Terminal)。 2. 进入到Flutter SDK的安装目录,通常是在用户目录下的flutter文件夹中。 3. 使用以下命令进入pub缓存目录:cd .pub-cache 4. 确保当前路径是在.pub-cache目录下。 5. 执行以下命令来清除pub-cache中的内容:flutter pub cache clean 6. 稍等片刻,Flutter会清除pub-cache中的内容。完成后,命令行会显示成功清除的提示信息。 需要注意的是,清除pub-cache中的内容意味着清除所有已下载的依赖包。这样一来,在下次运行Flutter项目时,Flutter将会重新下载并构建所需的依赖包。因此,在清除pub-cache之前,请确保你了解清楚操作的后果,并确认需要清除pub-cache中的内容。 此外,除了清除pub-cache中的内容,还可以使用flutter pub cache list命令来查看当前pub-cache中已安装的依赖包列表。这样可以帮助你进一步了解并管理当前项目所需的依赖包。 ### 回答3: 在Flutter中,pub-cache是用于存储Flutter项目依赖的第三方库的位置。当我们使用pub命令安装依赖时,它们会被下载并存储在pub-cache目录中。如果需要清除pub-cache中的内容,可以按照以下步骤进行操作: 1. 首先,打开命令行界面并导航到当前Flutter项目的根目录。 2. 运行pub cache clean命令。这将清除pub-cache目录中的所有内容,包括已下载的依赖。 3. 等待命令执行完成,此时pub-cache目录将被完全清除。 需要注意的是,清除pub-cache中的内容会导致所有依赖被删除,因此在执行此操作之前,应确保不会影响到当前项目的运行和构建。 另外,如果只想清除特定依赖的缓存,可以使用pub cache remove命令。例如,运行pub cache remove package_name将删除名称为package_name的依赖缓存。这对于解决特定依赖问题时可能很有用。 总结:要清除pub-cache中的所有内容,只需运行pub cache clean命令即可。此操作将删除项目中所有依赖的缓存。如需清除特定依赖的缓存,可以使用pub cache remove命令,并指定要删除的依赖名称。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值