1.如何使用

  1. 将此添加到pubspec.yaml文件中。
dependencies:get:
  1. 在MaterialApp前面加上 “Get”,就可以把它变成GetMaterialApp
GetMaterialApp( // Before: MaterialApp(home: MyHome(),
)

2.普通路由导航

  • 2.1 导航到新的页面。
Get.to(NextScreen());
  • 2.2 关闭SnackBars、Dialogs、BottomSheets或任何你通常会用Navigator.pop(context)关闭的东西。
Get.back();
  • 2.3进入下一个页面,但没有返回上一个页面的选项(用于SplashScreens,登录页面等)。
Get.off(NextScreen());
  • 2.4 进入下一个界面并取消之前的所有路由(在购物车、投票和测试中很有用)。
Get.offAll(NextScreen());
  • 2.5 要导航到下一条路由,并在返回后立即接收或更新数据。
var data = await Get.to(Payment());
  • 2.6 在另一个页面上,发送前一个路由的数据。并使用它,例:
Get.back(result: 'success');
if(data == 'success') madeAnything();
  • 2.7 与标准导航的关系 , 只要把 Navigator(大写)改成 navigator(小写),就可以拥有标准导航的所有功能,而不需要使用context
// 默认的Flutter导航
Navigator.of(context).push(context,MaterialPageRoute(builder: (BuildContext context) {return HomePage();},),
);// 使用Flutter语法获得,而不需要context。
navigator.push(MaterialPageRoute(builder: (_) {return HomePage();},),
);// get语法 (这要好得多)
Get.to(HomePage());

3.别名路由导航

3.1 导航到下一个页面

Get.toNamed("/NextScreen");

3.2 浏览并删除前一个页面。

Get.offNamed("/NextScreen");

3.3 浏览并删除所有以前的页面。

Get.offAllNamed("/NextScreen");

3.4 要定义路由,使用GetMaterialApp。

void main() {runApp(GetMaterialApp(initialRoute: '/',getPages: [GetPage(name: '/', page: () => MyHomePage()),GetPage(name: '/second', page: () => Second()),GetPage(name: '/third',page: () => Third(),transition: Transition.zoom  ),],));
}

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

void main() {runApp(GetMaterialApp(unknownRoute: GetPage(name: '/notfound', page: () => UnknownRoutePage()),initialRoute: '/',getPages: [GetPage(name: '/', page: () => MyHomePage()),GetPage(name: '/second', page: () => Second()),],));
}

3.6 发送数据到别名路由

只要发送你想要的参数即可。Get在这里接受任何东西,无论是一个字符串,一个Map,一个List,甚至一个类的实例。通过 Get.arguments 接受参数

Get.toNamed("/NextScreen", arguments: 'Get is the best');

类或控制器上:

print(Get.arguments);
//print out: Get is the best

3.7 动态网页链接

Get提供高级动态URL,就像在Web上一样。Web开发者可能已经在Flutter上想要这个功能了,Get也解决了这个问题。

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

在你的controller/bloc/stateful/stateless类上:

print(Get.parameters['id']);
// out: 354
print(Get.parameters['name']);
// out: Enzo

也可以用Get轻松接收NamedParameters。

void main() {runApp(GetMaterialApp(initialRoute: '/',getPages: [GetPage(name: '/',page: () => MyHomePage(),),GetPage(name: '/profile/',page: () => MyProfile(),),//你可以为有参数的路由定义一个不同的页面,也可以为没有参数的路由定义一个不同的页面,但是你必须在不接收参数的路由上使用斜杠"/",就像上面说的那样。GetPage(name: '/profile/:user',page: () => UserProfile(),),GetPage(name: '/third',page: () => Third(),transition: Transition.cupertino  ),],));
}

发送别名路由数据

Get.toNamed("/second/34954");

在第二个页面上,通过参数获取数据

print(Get.parameters['user']);
// out: 34954

或像这样发送多个参数

Get.toNamed("/profile/34954?flag=true");

在第二个屏幕上,通常按参数获取数据

print(Get.parameters['user']);
print(Get.parameters['flag']);
// out: 34954 true

现在,你需要做的就是使用Get.toNamed()来导航你的别名路由,不需要任何context(你可以直接从你的BLoC或Controller类中调用你的路由),当你的应用程序被编译到web时,你的路由将出现在URL中。

4 中间件

如果你想通过监听Get事件来触发动作,可以使用routingCallback来实现。

GetMaterialApp(routingCallback: (routing) {if(routing.current == '/second'){openAds();}}
)

如果你没有使用GetMaterialApp,你可以使用手动API来附加Middleware观察器。

void main() {runApp(MaterialApp(onGenerateRoute: Router.generateRoute,initialRoute: "/",navigatorKey: Get.key,navigatorObservers: [GetObserver(MiddleWare.observer), // HERE !!!],),);
}

创建一个MiddleWare类

class MiddleWare {static observer(Routing routing) {///你除了可以监听路由外,还可以监听每个页面上的SnackBars、Dialogs和Bottomsheets。if (routing.current == '/second' && !routing.isSnackbar) {Get.snackbar("Hi", "You are on second route");} else if (routing.current =='/third'){print('last route called');}}
}

现在,在你的代码上使用Get:

class First extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(leading: IconButton(icon: Icon(Icons.add),onPressed: () {Get.snackbar("hi", "i am a modern snackbar");},),title: Text('First Route'),),body: Center(child: ElevatedButton(child: Text('Open route'),onPressed: () {Get.toNamed("/second");},),),);}
}class Second extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(leading: IconButton(icon: Icon(Icons.add),onPressed: () {Get.snackbar("hi", "i am a modern snackbar");},),title: Text('second Route'),),body: Center(child: ElevatedButton(child: Text('Open route'),onPressed: () {Get.toNamed("/third");},),),);}
}class Third extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text("Third Route"),),body: Center(child: ElevatedButton(onPressed: () {Get.back();},child: Text('Go back!'),),),);}
}

5.免context导航

5.1 SnackBars

用Flutter创建一个简单的SnackBar,你必须获得Scaffold的context,或者你必须使用一个GlobalKey附加到你的Scaffold上。

final snackBar = SnackBar(content: Text('Hi!'),action: SnackBarAction(label: 'I am a old and ugly snackbar :(',onPressed: (){}),
);
// 在小组件树中找到脚手架并使用它显示一个SnackBars。
Scaffold.of(context).showSnackBar(snackBar);

用Get:

Get.snackbar('Hi', 'i am a modern snackbar');

有了Get,你所要做的就是在你代码的任何地方调用你的Get.snackbar,或者按照你的意愿定制它。

Get.snackbar("Hey i'm a Get SnackBar!", // title"It's unbelievable! I'm using SnackBar without context, without boilerplate, without Scaffold, it is something truly amazing!", // messageicon: Icon(Icons.alarm),shouldIconPulse: true,onTap:(){},barBlur: 20,isDismissible: true,duration: Duration(seconds: 3),
);// ALL FEATURES ////     Color colorText,//     Duration duration,//     SnackPosition snackPosition,//     Widget titleText,//     Widget messageText,//     bool instantInit,//     Widget icon,//     bool shouldIconPulse,//     double maxWidth,//     EdgeInsets margin,//     EdgeInsets padding,//     double borderRadius,//     Color borderColor,//     double borderWidth,//     Color backgroundColor,//     Color leftBarIndicatorColor,//     List<BoxShadow> boxShadows,//     Gradient backgroundGradient,//     TextButton mainButton,//     OnTap onTap,//     bool isDismissible,//     bool showProgressIndicator,//     AnimationController progressIndicatorController,//     Color progressIndicatorBackgroundColor,//     Animation<Color> progressIndicatorValueColor,//     SnackStyle snackStyle,//     Curve forwardAnimationCurve,//     Curve reverseAnimationCurve,//     Duration animationDuration,//     double barBlur,//     double overlayBlur,//     Color overlayColor,//     Form userInputForm///

如果您喜欢传统的SnackBars,或者想从头开始定制,包括只添加一行(Get.snackbar使用了一个强制性的标题和信息),您可以使用 Get.rawSnackbar();它提供了建立Get.snackbar的RAW API。

5.2 Dialogs

打开Dialogs:

Get.dialog(YourDialogWidget());

打开默认Dialogs:

Get.defaultDialog(onConfirm: () => print("Ok"),middleText: "Dialog made in 3 lines of code"
);

你也可以用Get.generalDialog代替showGeneralDialog。

对于所有其他的FlutterDialogs小部件,包括cupertinos,你可以使用Get.overlayContext来代替context,并在你的代码中任何地方打开它。 对于不使用Overlay的小组件,你可以使用Get.context。 这两个context在99%的情况下都可以代替你的UIcontext,除了在没有导航context的情况下使用 inheritedWidget的情况。

5.3 BottomSheets

Get.bottomSheet类似于showModalBottomSheet,但不需要context:

Get.bottomSheet(Container(child: Wrap(children: <Widget>[ListTile(leading: Icon(Icons.music_note),title: Text('Music'),onTap: () {}),ListTile(leading: Icon(Icons.videocam),title: Text('Video'),onTap: () {},),],),)
);

5.4 嵌套导航

Get让Flutter的嵌套导航更加简单。 你不需要context,而是通过Id找到你的导航栈。

  • 注意:创建平行导航堆栈可能是危险的。理想的情况是不要使用NestedNavigators,或者尽量少用。如果你的项目需要它,请继续,但请记住,在内存中保持多个导航堆栈可能不是一个好主意(消耗RAM)。
Navigator(key: Get.nestedKey(1), // create a key by indexinitialRoute: '/',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")),),),);}}
),

flutter之: GetX 的 路由管理相关推荐

  1. Flutter路由管理和接收页面的返回值

    Flutter使用Navigator进行路由管理. 跳转页面 使用Navigator的push方法进行跳转.可以看到总共有6个push方法 1.push(route) 通过路由跳转 通过路由进行跳转 ...

  2. Flutter 全能型选手GetX —— 路由管理

    使用篇   简介 依赖管理 路由管理 状态管理 主题配置 多语言配置 离线缓存 网络请求  原理篇 从源码看Getx的依赖原理  一.Getx 路由基本使用 1.普通路由 Get.to(SecondP ...

  3. Flutter路由管理代码这么长长长长长,阿里工程师怎么高效解决?(实用)

    背景: 在flutter的业务开发过程中,flutter侧会逐渐丰富自己的路由管理.一个轻量的路由管理本质上是页面标识(或页面路径)与页面实例的映射.本文基于dart注解提供了一个轻量路由管理方案.  ...

  4. Flutter系列-flutter路由管理

    Flutter路由管理 初识路由概念 一.路由管理 1.1.Route 1.2.MaterialPageRoute 1.3.Navigator 1.4.路由传值 1.5 命名路由 1.6.命名路由参数 ...

  5. flutter之路由管理

    路由管理 路由(Route)在移动开发中通常指页面(Page),这跟web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个ViewC ...

  6. Flutter路由管理和页面参数的传递(获取返回)

    前言 在做 Flutter 开发的时候所有的页面以及页面上的元素都变成了 Widget ,创建一个页面或者视图直接 new 一个新的 widget 就可以,相关的参数我们可以直接通过构造函数直接传递. ...

  7. Getx - 如何使用路由管理页面

    路由使用 英文文档参考,既然要get的使用,就需要首先再入口处使用 GetMaterialApp 示例代码仓库 1. GetMaterialApp GetMaterialApp常用配置参数说明 配置同 ...

  8. flutter中的路由表和路由管理

    查看更多flutter资料 MaterialPageRoute MaterialPageRoute继承自PageRoute类,PageRoute类是一个抽象类,表示占有整个屏幕空间的一个模态路由页面, ...

  9. Bolt 的 Flutter 路由管理实践(页面解耦,流程控制、功能拓展等)

    在各大移动开发框架(Android.iOS.Flutter.React Native-)中,路由管理始终是 UI 架构最具热议的话题之一. 一大原因就是应用程序的页面会 不可避免的多,我们可以使用 B ...

最新文章

  1. 用Python分析了1980~2015年考研英语真题词汇,原来考研英语应该这样考!
  2. redis底层数据结构之intset
  3. 【Compiling Swift source files】编译很慢;
  4. css中定义超级链接的样式
  5. leetcode-44. Wildcard Matching
  6. gitlab project项目迁移
  7. java 静态变量 new_java中静态对象和普通变量在初始化静态变量的时候有什么区别??高手!!...
  8. dubbo之.xml配置文件报错
  9. Java集合List,Set,Map,Queue,Deque
  10. docker部署php的性能,Docker 学习之部署php + nginx(一)
  11. python pdfplumber 打开文件失败_喜大普奔 | 如何在Win10下利用Python打开grib文件
  12. 性能测试指标:吞吐量,qps,并发量,响应时间
  13. Qi v1.2.4协议 之 9 Stand-by Power 【英文翻译】
  14. UrlEncoder和UrlDecoder
  15. 2017百度之星资格赛 1001/hdu 6080 度度熊保护村庄
  16. 不值一提?开源CRM是否值得应用
  17. springboot集成openoffice实现office转PDF在线预览
  18. win10重装应用商店
  19. 2018入门微单相机推荐
  20. c语言是由什么构成的,一个c语言是由什么构成

热门文章

  1. 玉米社:sem竞价推广如何选择投放时间、投放地域
  2. 【博客之星】坚持,是一种信仰
  3. 开环直流电机的机械特性_直流电机调速开环控制.docx
  4. You earned your Program Management Professional (PgMP)® Credential
  5. @Scheduled同步多线程配置
  6. gitee团队协作使用
  7. Qt实现简单拼图游戏
  8. CSR蓝牙开发调试经验
  9. 记一次perl使用lwp获取结果为乱码
  10. 魔术表演的核心秘密(一)——开篇简介