GetX 是 Flutter 上的一個(gè)輕量且強(qiáng)大的解決方案:高性能的狀態(tài)管理、智能的依賴注入和便捷的路由管理。
1、狀態(tài)管理
Obx是配合Rx響應(yīng)式變量使用、GetBuilder是配合update使用:請注意,這完全是倆套定點(diǎn)刷新控件的方案。
區(qū)別:前者響應(yīng)式變量變化,Obx自動刷新;后者需要使用update手動調(diào)用刷新每一個(gè)響應(yīng)式變量,都需要生成對應(yīng)的GetStream,占用資源大于基本數(shù)據(jù)類型,會對內(nèi)存造成一定壓力
GetBuilder內(nèi)部實(shí)際上是對StatefulWidget的封裝,所以占用資源極?。ㄍ扑]使用)
2、控制器的注入
- 靜態(tài)路由綁定
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);
- 動態(tài)路由綁定
Get.to(AsWorkStatisticsPage(),binding: AsWorkStatisticsBinding());
- 頁面注入
Get.lazyPut<AsWorkStatisticsController>(() => AsWorkStatisticsController());
3、動態(tài)/簡單路由和靜態(tài)/命名路由
請注意命名路由,只需要在api結(jié)尾加上Named即可,舉例:
- 默認(rèn):Get.to(SomePage());
- 命名路由:Get.toNamed(“/somePage”);
- 導(dǎo)航到新的頁面
Get.to(NextScreen());
Get.toNamed("/NextScreen");
- 關(guān)閉SnackBars、Dialogs、BottomSheets或任何你通常會用Navigator.pop(context)關(guān)閉的東西
Get.back();
- 進(jìn)入下一個(gè)頁面,但沒有返回上一個(gè)頁面的選項(xiàng)(用于SplashScreens,登錄頁面等)
Get.off(NextScreen());
Get.offNamed("/NextScreen");
- 進(jìn)入下一個(gè)界面并取消之前的所有路由(在購物車、投票和測試中很有用)
Get.offAll(NextScreen());
Get.offAllNamed("/NextScreen");
- 發(fā)送數(shù)據(jù)到其它頁面
只要發(fā)送你想要的參數(shù)即可。Get在這里接受任何東西,無論是一個(gè)字符串,一個(gè)Map,一個(gè)List,甚至一個(gè)類的實(shí)例。
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
- 要導(dǎo)航到下一條路由,并在返回后立即接收或更新數(shù)據(jù)
var data = await Get.to(Payment());
var data = await Get.toNamed("/payment");
- 在另一個(gè)頁面上,發(fā)送前一個(gè)路由的數(shù)據(jù)
Get.back(result: 'success');
// 并使用它,例:
if(data == 'success') madeAnything();
- 跳轉(zhuǎn)重復(fù)頁面,可以這樣寫
Get.to(XxxxPage(), preventDuplicates: false);
// 或者
Get.toNamed('xxx', preventDuplicates: false);
- 如果你不想使用GetX語法,只要把 Navigator(大寫)改成 navigator(小寫),你就可以擁有標(biāo)準(zhǔn)導(dǎo)航的所有功能,而不需要使用context,例如:
// 默認(rèn)的Flutter導(dǎo)航
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有一個(gè)名為controller的getter的const Stateless的Widget,如果我們只有單個(gè)控制器作為依賴項(xiàng),那我們就可以使用GetView,而不是使用StatelessWidget,并且避免了寫Get.Find()。
GetView的使用方法非常簡單,只是要將你的視圖層繼承自GetView并傳入需要注冊的控制器并Get.put()即可:
class GetViewAndGetWidgetExample extends GetView<GetViewCountController> {
@override
Widget build(BuildContext context) {
Get.put(GetViewCountController());
return Container();
}
}