這是一個與flutter中getx有關的問題。 我有兩個控制器。ContractsController和NotificationController。 在ContractsController中,我已經通過呼叫Api請求將值放入觀察者變數。 我現在想要的是在另一個控制器--NotificationController中獲得該變數的資料。 如何使用getx函式來獲取這個值呢?
ContractsController
class ContractsController extends GetxController {
ExpiringContractRepository _expiringContractRepository。
final expiringContracts = <ExpiringContract>[].obs; // This is the value what I want in another controller
ContractsController() {
_expiringContractRepository = new ExpiringContractRepository();
}
@override
Future<void> onInit() async {
await refreshContracts()。
super.onInit()。
}
Future refreshContracts({bool showMessage}) async {
await getExpiringContracts();
if (showMessage == true) {
Get.showSnackbar(Ui.SuccessSnackBar(message: "過期合同串列重繪 成功".tr))。)
}
}
Future getExpiringContracts() async {
try {
expiringContracts.value = await _expiringContractRepository.getAll(); // put the value from the api.
} catch (e) {
Get.showSnackbar(Ui.ErrorSnackBar(message: e.toString()))。
}
}
在api請求后,expiringContracts被成功地用資料更新。 現在,我想在NotificationController中獲得這個值
NotificationController
NotificationController
class NotificationsController extends GetxController {
final notifications = <Notification>[].obs;
ContractsController contractsController;
NotificationsController() {
}
@override
void onInit() async {
contractsController = Get.find<ContractsController>()。
print(contractsController.expiringContracts); // This shows an empty list ?????.
super.onInit()。
}
}
uj5u.com熱心網友回復:
概覽
我想到了幾個解決方案:
expiringContracts串列作為構造引數傳遞給NotificationsController,如果你只需要在實體化時做一次,或者expiringContracts 時更新 NotificationsController第一個解決方案與GetX無關,而只是在ContractsController和NotificationsController之間進行異步協調,因此讓我們專注于第二個解決方案。GetX Workers.
詳細資訊
在NotificationsController中,創建一個方法來接收expiringContracts。
類似于:
class NotificationsController extends GetxController {
void refreshContracts(List<ExpiringContract> contracts) {
//做一些事情。
}
}
請注意:這段代碼沒有經過測驗。 我純粹是在StackOverflow中寫的,所以請認為這是偽代碼。
在ContractsController中,我們將提供上述回呼方法作為建構式引數:
在ContractsController中,類似于:
class ContractsController {
final expiringContracts = <ExpiringContract> [].obs
final Function(List<ExpiringContract> ) refreshContractsCallback;
ContractsController(this.refreshContractsCallback)。
@override
void onInit() {
super.onInit()。
refreshContracts(); //在super.onInit之后做你的事情。
ever(expiringContracts, refreshContractsCallback)。
// ↑ contracts → refreshContractsCallback(contracts)
//當expiringContracts更新時,用它們運行回呼。
}
}
在這里,GetX ever作業者將觀察物件作為第一個引數,并將一個函式作為第二個引數。 該函式必須接受一個與被觀察變數型別相匹配的引數,即List<ExpiringContract>,因此refreshContractsCallback的型別被定義為Function(List<ExpiringContract>)。
現在,每當ContractsController中的可觀察的expiringContracts被更新時,refreshContractsCallback(contracts)將被呼叫,它通過refreshContracts向NotificationsController提供到期的合同串列。
最后,在實體化這兩個控制器時在你的路由/頁面的build()方法內:
NotificationsController nx = Get.put(NotificationsController() );
ContractsController cx = Get.put(ContractsController(nx.refreshContracts))。
事件的時間線
NotificationsController被創建為nx.nx.onInit()運行,緩慢呼叫refreshContracts()開始ContractsController被創建,帶有nx.refreshContracts回呼nx在這一點上沒有合同資料,所以你可能需要一個FutureBuilder或一個Obx/GetXStatelessWidget,當資料最終到達時將重建 。
refreshContracts()完成時,ever作業者運行,將合同發送到nxnx.refreshContracts(contracts)運行,對合同做一些處理注釋
- async/await被從
nx.onInit中洗掉。
ever作業器將在refreshContract完成后運行 。
uj5u.com熱心網友回復:
在GetX中,有一些強大的方法。我通過Get.put和Get.find解決了這個問題
這里是GetX的代碼。
這里是我添加的代碼。
ContractsController
class ContractsController extends GetxController {
ExpiringContractRepository _expiringContractRepository。
final expiringContracts = <ExpiringContract>[].obs; // This is the value what I want in another controller
ContractsController() {
_expiringContractRepository = new ExpiringContractRepository();
}
@override
Future<void> onInit() async {
await refreshContracts()。
super.onInit()。
}
Future refreshContracts({bool showMessage}) async {
await getExpiringContracts();
if (showMessage == true) {
Get.showSnackbar(Ui.SuccessSnackBar(message: "過期合同串列重繪 成功".tr))。)
}
}
Future getExpiringContracts() async {
try {
expiringContracts.value = await _expiringContractRepository.getAll(); // put the value from the API.
//******************************** //
Get.put(ContractsController()); //此處添加。
} catch (e) {
Get.showSnackbar(Ui.ErrorSnackBar(message: e.toString()))。
}
}
NotificationController
class NotificationsController NotificationsController extends title">NotificationsController extends GetxController {
final notifications = <Notification>[].obs;
ContractsController contractsController;
NotificationsController() {
}
@override
void onInit() async {
//******************************** // {
contractsController = Get.find<ContractsController>(); //此處添加。
print(contractsController.expiringContracts); // This shows the updated value.
super.onInit()。
}
}
最后,我發現GetX對于flutter中的狀態管理來說是簡單而強大的。 謝謝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313402.html
標籤:
