GetX數據管理總結
GetX數據管理總結
Get有兩個不同的狀態管理器:簡單的狀態管理器(GetBuilder)和響應式狀態管理器(GetX和Obx)。
簡單狀態管理
簡單狀態管理,當數據源變化時,需要手動執行刷新組件的方法,此狀態管理器內部實際上是對StatefulWidget的封裝,占用資源極少
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class CounterController extends GetxController {
int count = 0; // 普通狀態,沒有使用obx設置為響應式變量
void increment() {
count++;
update(); // 當狀態改變時,手動通知 GetBuilder 重新構建 UI。
}
}
void main() {
runApp(
GetMaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('GetBuilder Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GetBuilder<CounterController>(
init: CounterController(),
builder: (controller) {
return Text('Count: ${controller.count}');
},
),
ElevatedButton(
onPressed: () {
Get.find<CounterController>().increment();
},
child: Text('Increment'),
),
],
),
),
),
),
);
}
響應式狀態管理
Obx和GetX:響應式狀態管理,當數據源變化時,將自動執行刷新組件的方法;
但Getx允許在構建時初始化控制器,并且在
builder函數中直接使用傳入的控制器實例。
/**
* Obx方式
**/
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class CounterController extends GetxController {
var count = 0.obs;
void increment() {
count.value++;
}
}
// CounterController 中的 count 是一個可觀察變量,Obx 監聽 count 的變化,當 increment 方法被調用使 count 值改變時,Obx 內部的 Text 組件會自動更新。
void main() {
Get.put(CounterController()); // 注冊控制器
runApp(
GetMaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Obx Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Obx(() => Text('Count: ${Get.find<CounterController>().count}')),
ElevatedButton(
onPressed: () {
Get.find<CounterController>().increment();
},
child: Text('Increment'),
),
],
),
),
),
),
);
}
/**
* GetX實現方式
*/
import 'package:flutter/material.dart';
import 'package:get/get.dart';
class CounterController extends GetxController {
var count = 0.obs;
void increment() {
count.value++;
}
}
// GetX 通過 init 初始化控制器,在 builder 函數中可以直接使用傳入的控制器實例來訪問其狀態和方法。
void main() {
runApp(
GetMaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('GetX Example')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GetX<CounterController>(
init: CounterController(),
builder: (controller) {
return Text('Count: ${controller.count}');
},
),
ElevatedButton(
onPressed: () {
Get.find<CounterController>().increment();
},
child: Text('Increment'),
),
],
),
),
),
),
);
}
使用場景
Obx:適用于需要實時響應狀態變化的場景,尤其是狀態變化頻繁且需要自動更新 UI 的情況。例如,實時顯示輸入框的內容、實時更新計數器的值等。GetX:和Obx適用場景類似,但當你希望在構建時初始化控制器并直接使用控制器實例時,使用GetX會更方便。GetBuilder:適合狀態變化不頻繁,或者你希望手動控制 UI 更新的場景。例如,在某些操作完成后才更新 UI,這樣可以減少不必要的 UI 重建,提高性能。
性能表現
Obx和GetX:由于它們基于響應式編程,會自動監聽狀態變化,可能會有一定的性能開銷。不過,GetX 框架在設計上已經做了優化,能盡量減少不必要的重建。GetBuilder:因為需要手動調用update方法來更新 UI,所以可以更精確地控制 UI 重建的時機,在一些情況下能減少性能開銷。但如果忘記調用update方法,UI 就不會更新。
總結
一般來說,對于大多數場景都是可以使用響應式變量。但是每個響應式變量(.obs),都需要生成對應的 Stream,如果對象足夠多,將生成大量的 Stream,必將對內存造成較大的壓力,該情況下,就要考慮使用簡單狀態管理了

浙公網安備 33010602011771號