我在 Flutter 專案中使用 GetX 進行狀態管理。我的問題是當我單擊復選框時,它會更新控制器中的狀態,但未在 UI 中顯示結果。一般來說,改變的狀態也應該改變 UI。我不確定是什么問題,但我認為在 getx 中使用 observable 變數存在錯誤。如何解決這個問題呢?如果帖子不清楚,請問我。
這是視圖。
class FilterBottomSheetWidget extends GetView<SearchController> {
@override
Widget build(BuildContext context) {
return Container(
height: Get.height - 90,
child: Stack(
children: <Widget>[
Padding(
padding: const EdgeInsets.only(top: 80),
child: Container(
padding: EdgeInsets.only(top: 20, bottom: 15, left: 4, right: 4),
child: controller.expiringContractStatus.isEmpty ? CircularLoadingWidget(height: 100)
: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: ExpansionTile(
title: Text("Contract Status".tr, style: Get.textTheme.bodyText2),
children: List.generate(controller.expiringContractStatus.length, (index) {
var _expiringContractStatus = controller.expiringContractStatus.elementAt(index);
return CheckboxListTile(
controlAffinity: ListTileControlAffinity.trailing,
value: _expiringContractStatus["isCheck"], // ************
onChanged: (value) {
controller.itemChange(value, index); // ************
controller.update();
},
title: Text(
_expiringContractStatus["title"],
style: Get.textTheme.bodyText1,
overflow: TextOverflow.fade,
softWrap: false,
maxLines: 1,
),
);
}),
initiallyExpanded: true,
);
}
)
),
),
// more widgets
],
),
);
}
}
這是搜索控制器。
class SearchController extends GetxController {
final expiringContractStatus = <Map>[
{
"title": "aaa",
"isCheck": false
},
{
"title": "bbb",
"isCheck": false
},
{
"title": "ccc",
"isCheck": false
}
].obs;
@override
void onInit() async {
await refreshSearch();
super.onInit();
}
void itemChange (bool value, int index) {
expiringContractStatus[index]["isCheck"] = value; // *************
update();
}
}
uj5u.com熱心網友回復:
更新答案:
如果您嘗試包裝 anObx并且它不起作用,請GetBuilder<SearchController>改用。
GetBuilder<SearchController>(
builder: (_) => controller.expiringContractStatus.isEmpty ? CircularLoadingWidget(height: 100)
: SingleChildScrollView(...))
當您呼叫update()它時,無論如何都會使用更新的值觸發重建。我能想到為什么Obx不起作用的唯一原因是,當涉及到串列時,可能只回應添加或洗掉串列中的專案,而不回應嵌套在其中的屬性的更改。
通常,您可能會發現在大多數情況下,實際上并不需要使用基于可觀察流的變數。GetBuilder可以處理您需要完成的大部分或全部作業,除非您正在執行基于流的操作(例如系結到外部 Firebase 集合)。兩者都沒有錯,但它GetBuilder是性能最高的選項,因為流本質上要貴一些。
原答案:
我建議您在聲稱其他人的代碼中存在錯誤之前閱讀有關正確使用的檔案。這適用于您正在使用的任何軟體包。
它指出各地Readme,并在堿性反應用的例子,觀測變數需要被放置在一個Obx小部件,否則沒有什么觸發重建基于可觀察的getX變數的更新狀態。
你的孩子Container應該是
Obx(() => controller.expiringContractStatus.isEmpty ? CircularLoadingWidget(height: 100)
: SingleChildScrollView(...))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/338156.html
標籤:javascript 扑 镖 颤振布局 颤振-getx
