Spe*_*der 3 javascript dart flutter flutter-layout flutter-getx
我正在使用 GetX 进行 flutter 项目的状态管理。我的问题是,当我单击复选框时,它会更新控制器中的状态,但不会在 UI 中显示结果。一般来说,改变的状态也应该改变 UI。我不确定问题是什么,但我认为在 getx 中使用可观察变量有一个错误。如何解决这个问题呢?如果帖子不清楚的话请问我。
这就是观点。
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
],
),
);
}
}
Run Code Online (Sandbox Code Playgroud)
这是搜索控制器。
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();
}
}
Run Code Online (Sandbox Code Playgroud)
更新答案:
如果您尝试包装 anObx但它不起作用,请GetBuilder<SearchController>改用。
GetBuilder<SearchController>(
builder: (_) => controller.expiringContractStatus.isEmpty ? CircularLoadingWidget(height: 100)
: SingleChildScrollView(...))
Run Code Online (Sandbox Code Playgroud)
当您调用时,update()无论如何都会使用更新的值触发重建。我能想到为什么Obx不起作用的唯一原因是,也许当涉及到列表时,仅响应列表中项目的添加或删除,而不响应嵌套在其中的属性的更改。
一般来说,您可能会发现在大多数情况下并不真正需要使用基于可观察流的变量。GetBuilder可以处理大部分或全部您需要完成的操作,除非您正在执行基于流的操作(例如绑定到外部 Firebase 集合)。两者都没有问题,但它GetBuilder是性能最好的选择,因为流本质上要贵一些。
原答案:
我建议您在声称其他人的代码中存在错误之前先阅读有关正确使用的文档。这适用于您正在使用的任何软件包。
在基本计数器应用程序示例Readme中,所有可观察变量都需要放置在小Obx部件中,否则不会根据可观察 GetX 变量的更新状态触发重建。
你的孩子Container应该是
Obx(() => controller.expiringContractStatus.isEmpty ? CircularLoadingWidget(height: 100)
: SingleChildScrollView(...))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4098 次 |
| 最近记录: |