GetX 是 Flutter 上的一个轻量且强大的解决方案:高性能的状态管理、智能的依赖注入和便捷的路由管理。
1、状态管理
Obx是配合Rx响应式变量使用、GetBuilder是配合update使用:请注意,这完全是俩套定点刷新控件的方案。
区别:前者响应式变量变化,Obx自动刷新;后者需要使用update手动调用刷新每一个响应式变量,都需要生成对应的GetStream,占用资源大于基本数据类型,会对内存造成一定压力
GetBuilder内部实际上是对StatefulWidget的封装,所以占用资源极小(推荐使用)
2、控制器的注入
- 静态路由绑定
class AsWorkStatisticsBinding implements Bindings {
@override
void dependencies() {
Get.lazyPut<AsWorkStatisticsController>(() => AsWorkStatisticsController());
}
}
static final List<GetPage> routes = [
GetPage(
name: workStatisticsPage,
page: () => const AsWorkStatisticsPage(),
binding: AsWorkStatisticsBinding(),
),
];
Get.toNamed(ASRouteConfig.workPlanDetailPage);
- 动态路由绑定
Get.to(AsWorkStatisticsPage(),binding: AsWorkStatisticsBinding());
- 页面注入
Get.lazyPut<AsWorkStatisticsController>(() => AsWorkStatisticsController());
3、动态/简单路由和静态/命名路由
请注意命名路由,只需要在api结尾加上Named即可,举例:
- 默认:Get.to(SomePage());
- 命名路由:Get.toNamed(“/somePage”);
- 导航到新的页面
Get.to(NextScreen());
Get.toNamed("/NextScreen");
- 关闭SnackBars、Dialogs、BottomSheets或任何你通常会用Navigator.pop(context)关闭的东西
Get.back();
- 进入下一个页面,但没有返回上一个页面的选项(用于SplashScreens,登录页面等)
Get.off(NextScreen());
Get.offNamed("/NextScreen");
- 进入下一个界面并取消之前的所有路由(在购物车、投票和测试中很有用)
Get.offAll(NextScreen());
Get.offAllNamed("/NextScreen");
- 发送数据到其它页面
只要发送你想要的参数即可。Get在这里接受任何东西,无论是一个字符串,一个Map,一个List,甚至一个类的实例。
Get.to(NextScreen(), arguments: 'Get is the best');
Get.toNamed("/NextScreen", arguments: 'Get is the best');
在你的类或控制器上。
print(Get.arguments);
//print out: Get is the best
- 要导航到下一条路由,并在返回后立即接收或更新数据
var data = await Get.to(Payment());
var data = await Get.toNamed("/payment");
- 在另一个页面上,发送前一个路由的数据
Get.back(result: 'success');
// 并使用它,例:
if(data == 'success') madeAnything();
- 跳转重复页面,可以这样写
Get.to(XxxxPage(), preventDuplicates: false);
// 或者
Get.toNamed('xxx', preventDuplicates: false);
- 如果你不想使用GetX语法,只要把 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());
4、GetView的使用
GetView只是对已注册的Controller有一个名为controller的getter的const Stateless的Widget,如果我们只有单个控制器作为依赖项,那我们就可以使用GetView,而不是使用StatelessWidget,并且避免了写Get.Find()。
GetView的使用方法非常简单,只是要将你的视图层继承自GetView并传入需要注册的控制器并Get.put()即可:
class GetViewAndGetWidgetExample extends GetView<GetViewCountController> {
@override
Widget build(BuildContext context) {
Get.put(GetViewCountController());
return Container();
}
}