GETX

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();
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容