本文最后更新于:2023年8月14日 下午
GetX GetX是个Flutter开发框架,当你用原生Flutter开发一个APP,受尽折磨之后,你就能体会到这个框架的优雅了,真香!
1、路由
1 2 3 4 5 6 7 8 9 10 11 12 Get.toNamed('/ddd' ); Get.offNamed('/ddd' ); Get.back(); Get.offNamedUntil('/bbb' , ModalRoute.withName('/aaa' )); Get.until(ModalRoute.withName('/bbb' )); Get.offAllNamed('/bbb' );
2、状态管理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 、obs配合obx Obx(() {return Text('我是数据${state.ob['a' ]} ' );}),Map <String ,dynamic > ob = { 'a' :55 , 'b' :66 }.obs;2 、update配合getbuilder GetBuilder<PageaaaLogic>(builder: (logic) {return Text('我是数据${state.aNumber} ' );}),void setNumber(){ state.aNumber+=5 ; update(); }
3、跨页面通信
1 2 3 4 5 6 7 8 9 10 11 final bLogic = Get.find<PagebbbLogic>(); ElevatedButton( child: new Text('在页面上调用B的方法,更新B页面数据' ), onPressed: () { bLogic.setNumber(); }, ),
4、全局变量和数据固化
嗯,还是 SharedPreferences 永远的神
5、弹框
https://www.jianshu.com/p/169af33a5994
1 2 3 4 5 6 Get.snackbar("Snackbar 标题" , "欢迎使用Snackbar" ,backgroundColor:Colors.cyan,snackPosition: SnackPosition.TOP); Get.defaultDialog(); Get.bottomSheet();
6、主题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 class Themes { static final green = ThemeData.light().copyWith( scaffoldBackgroundColor: Colors.green, appBarTheme: const AppBarTheme( backgroundColor: Colors.green, toolbarTextStyle:TextStyle(color: Colors.white, fontSize: 30 )), ); static final yellow = ThemeData.light().copyWith( scaffoldBackgroundColor: Colors.yellow, appBarTheme: const AppBarTheme( backgroundColor: Colors.yellow, toolbarTextStyle:TextStyle(color: Colors.white, fontSize: 30 )), elevatedButtonTheme: ElevatedButtonThemeData(style: ButtonStyle(backgroundColor: MaterialStateProperty.all(Colors.deepOrange)))); }return GetMaterialApp( title: 'Flutter Demo' , theme: ThemeData( primarySwatch: Colors.blue, ), ) Get.changeTheme(Themes.yellow);
7、网络
还是用dio,术业有专攻吧,感觉GetConnect的错误处理不如dio
8、插件介绍
https://juejin.cn/post/7005003323753365517 —文件生成器介绍篇
easy模式就够我们用了
pageview要特殊处理一下
9、api
1 2 3 4 5 6 7 8 Get.put<PutController>(PutController()); Get.find<PutController>();
10、组件
没有合适的整套的
https://github.com/felixblaschke/simple_animations —这个动画应该有用
11、生命周期
参考:https://zhuanlan.zhihu.com/p/445371503
常用的就是:
onInit(初始化,页面加载到内存中触发);
onReady(就绪,处理接口,业务逻辑);
onClose(销毁,删除监听事件)
另外的onResume等等,要用 WidgetsBindingObserver,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 import 'package:flutter/cupertino.dart' ;import 'package:get/get.dart' ;import 'state.dart' ;class PagebbbLogic extends GetxController with WidgetsBindingObserver { final PagebbbState state = PagebbbState(); void setNumber(){ state.bNumber+=5 ; } void setOb(){ state.ob['a' ] += 5 ; } @override void onInit() { super .onInit(); print ('init' ); WidgetsBinding.instance?.addObserver(this ); } @override void onReady() { super .onReady(); print ('onReady' ); var map = Get.arguments; print (map); } @override void onClose() { super .onClose(); print ('onClose' ); WidgetsBinding.instance?.removeObserver(this ); } @override Future didChangeAppLifecycleState(AppLifecycleState state) async { print (state); switch (state) { case AppLifecycleState.inactive: print ("inactive" ); break ; case AppLifecycleState.resumed: print ("进入resumed" ); break ; case AppLifecycleState.paused: print ("进入后台paused" ); break ; case AppLifecycleState.detached: break ; default : } } }
12、小知识
https://github.com/jonataslaw/getx#dependency-management —-官方文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Get.arguments Get.previousRoute GetPlatform.isAndroid GetPlatform.isIOS Get.isSnackbarOpen Get.isDialogOpen Get.isBottomSheetOpen Get.height Get.width Get.context Get.contextOverlay
12、原理
https://juejin.cn/post/6909445601269088270
https://juejin.cn/post/6984593635681517582#heading-19
数据刷新的原理:
1、GetBuilder加手动update:GetBuilder实际上是个 StatefulWidget,update底层实际上是setState();
2、obx加obs:obx继承ObxWidget,ObxWidget实际上也继承了StatefulWidget,obx初始化的时候会**RxNotifier()**订阅包含的obs变量的变化 ,obs值发生变化就会触发setState();
—obs是在原数据的基础上内置callback的数据类型,数据变动触发callback,就是触发obx刷新;
所以表面上看我们使用get框架写的页面都是StatelessWidget,实际上涉及数据操作的部分,底层还是StatefulWidget,万变不离其宗。
无context的路由跳转原理:
源码直接就能看到,用的就是原始的无context跳转:navigatorKey.currentState.pushNamed(‘/home’)
参考链接:
https://segmentfault.com/a/1190000039139198 —好文章,介绍篇
https://juejin.cn/post/7005003323753365517 —文件生成器介绍篇
https://juejin.cn/post/6984593635681517582 —-原理篇