GetX — Flutter 開發的百寶箱

前言

GetX 與其說是一個狀態管理庫,倒不如是是一個簡化 Flutter 開發的百寶箱。它提供了很多工具來簡化我們的開發,本篇我們先對 GetX 有一個大概的認識,然后接下來的篇章再將 GetX 的具體應用。

GetX 工具介紹

官方文檔給出關于 GetX 的介紹如下:

GetX is an extra-light and powerful solution for Flutter. It combines high-performance state management, intelligent dependency injection, and route management quickly and practically.
GetX是一個超輕量且強大的 Flutter 應用解決方案。它組合了高性能的狀態管理、智能的依賴注入以及快速可用的路由管理。

而實際上,GetX 還有更多的小工具,示例如下:

路由

路由支持命名路由和匿名路由:

Get.to(() => Home());
Get.toNamed('/home');
// 返回上一個頁面
Get.back();
// 使用下一個頁面替換
Get.off(NextScreen());
// 清空導航堆棧全部頁面
Get.offAll(NextScreen());
// 獲取命名路由參數
print(Get.parameters['id']);
print(Get.parameters['name']);

GetX 的路由好處是不依賴于 context,十分簡潔,更多路由介紹可以參考:GetX 路由介紹官方文檔

SnackBar

Flutter 自身攜帶的 SnackBar 有很多限制,而 GetX 的非常簡單,當然也有更多的樣式配置和位置配置參數。

Get.snackbar('SnackBar', '這是GetX的SnackBar');

對話框

對話框也一樣,默認的對話框開箱即用。

Get.defaultDialog(
  title: '對話框',
  content: Text('對話框內容'),
  onConfirm: () {
    print('Confirm');
    Get.back();
  },
  onCancel: () {
    print('Cancel');
  },
);

內存緩存

GetX 可以緩存內容對象,以便在不同頁面共享數據。使用的時候需要注意,需要先 put 操作再 find操作,否則會拋異常。

Get.put(CacheData(name: '這是緩存數據'));
CacheData cache = Get.find();

離線存儲

GetX 提供了一個 get_storage 插件用于離線存儲,與 shared_preferences 相比,其優點是純 Dart 編寫,不依賴于原生,因此可以在安卓、iOS、Web、Linux、Mac 等多個平臺使用。GetStorage 是基于內存和文件存儲的,當內存容器中有數據時優先從內存讀取。同時在構建 GetStorage 對象到時候指定存儲的文件名以及存儲數據的容器。

GetStorage storage = GetStorage();
storage.write('name', '島上碼農');
storage.read('name');

更改主題

可以說是一行代碼搞定深色和淺色模式,也可以更改為自定義主題 —— 老板讓你根據手機殼改主體顏色的需求已經搞定了一大半了!

Get.changeTheme(
  Get.isDarkMode ? ThemeData.light() : ThemeData.dark());
},
更換主題

多語言支持

多語言支持使用數據字典完成,在 GetMaterialApp 指定字典對象(繼承自 Translations),使用字符串的時候假設.tr 后綴,就可以在切換語言的時候自動切換字符串對應語言的翻譯了。

class GetXDemo extends StatelessWidget {
  // 省略其他代碼
  TextButton(
    onPressed: () {
      var locale = Locale('en', 'US');
      Get.updateLocale(locale);
    },
    child: Text('name'.tr),
  ),
}

class Messages extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        'en_US': {
          'name': 'Island Coder',
        },
        'zh_CN': {
          'name': '島上碼農',
        }
      };
}
class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return GetMaterialApp(
      translations: Messages(),
      locale: Locale('zh', 'CN'),
      color: Colors.white,
      navigatorKey: Get.key,
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        brightness: Brightness.light,
      ),
      home: GetXDemo(),
    );
  }
}

GetX 的理念

GetX有三個基本的理念,分別是性能、生產力和組織性(Organization)。

  • 性能(Performance):GetX 關注性能并最小化資源消耗。GetX 不使用 StreamChangeNotifier
  • 生產力(Productivity):GetX 使用簡潔愉悅的語法。不管你要做什么,使用 GetX都會覺得簡便。這使得開發的時間大大節省,并且保證應用性能的最大化。通常來說,開發者需要關注從內存中移除控制器。而使用 GetX 的時候,則無需這么做。當控制器不被使用的時候,資源會自動從內存中釋放。如果確實需要常住內存,那就需要在依賴中聲明 permanent:true。通過這種方式,可以降低內存中有過多不必要依賴對象的風險。同時,依賴默認也是懶加載。
  • 組織性(Organization):GetX 可以將視圖、展示邏輯、業務邏輯、依賴注入和導航完全解耦。路由之間跳轉無需 context,因此我們的導航不會依賴組件樹。也不需要使用通過 InheritedWidgetcontext 訪問控制器或 BLOC 對象,因此可以將展示邏輯和業務邏輯從虛擬的組件層分離。我們也不需要像 MultiProvider 那樣往組件樹中注入 Controller/Model/Bloc 等類對象。因此可以將依賴注入和視圖分離。

GetX 生態

GetX 有很多特性,使得編碼變得容易。每個特性之間是相互獨立的,并且只會在使用的時候才啟動。例如,如果僅僅是使用狀態管理,那么只有狀態管理會被編譯。而如果只使用路由,那么狀態管理的部分就不會編譯。

GetX 有一個很大的生態,包括了大型的社區維護,大量的協作者(GitHub 上看有132位),并且承諾只要 Flutter 存在就會繼續維護下去。而且 GetX 兼容 Android, iOS, Web, Mac, Linux, Windows多個平臺。GetX 甚至還有服務端版本 Get_Server(感覺Flutter要一統程序員界啊,啥時候支持鴻蒙?)。

為了簡化開發,GetX 還提供了腳手架工具GET_CLI和 VSCode 插件GetX Snippets(也有Android Studio和 Intellij 插件)。提供了如下快速代碼模板:

  • getmain:GetX 的 main.dart代碼;
getmain.gif
  • getmodel:Model 類代碼,包括了 fromJson 和 toJson 方法
getmodel.gif

總結

本篇對 GetX 插件做了簡單的介紹,可以看到 GetX 的生態確實很豐富,感覺是一個集大成者,GetX 基本上涵蓋了 Flutter應用開發的很大一部分,如路由、主題、多語言、彈層、狀態管理、依賴注入、網絡請求封裝等等。GetX看著像一個框架, 但實際上它的各個模塊是獨立的,其實是一個工具箱。對于開發的時候,可以用它的全家桶,也可以從中任取所需的模塊到我們的應用中使用。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容