Flutter GetX 变量发生变化但 UI 没有
Flutter GetX variable changes but UI does not
我有两个包含自定义模型的 RxLists:
var openDepartures = RxList<Departure>([]);
var finishedDepartures = RxList<Departure>([]);
我绑定一个流以使用来自 firebase 的值填充这些 RxList。由于我的流(我绑定到变量)根据用户的选择而变化,我将新流绑定到同一个变量,但由于这会导致两个流控制一个变量,我在此之前“重置”变量:
openDepartures = RxList<Departure>();
finishedDepartures = RxList<Departure>();
....
openDepartures.bindStream(
Database().getOpenDepartures(
userController.userLocation.value,
),
);
finishedDepartures.bindStream(
Database().getFinishedDepartures(
userController.userLocation.value,
),
);
问题是 UI 没有刷新,但是当我不“重置”变量时,一切正常。同样奇怪的是,变量确实填充了正确的数据。它只是没有显示在 UI.
中
我尝试解决的问题:
- update() 方法
- Get.reloadAll()
- 对变量调用 .refresh()
- 重新配置并初始化控制器
我现在的问题是,如何让屏幕刷新,或者有人知道如何在不“重置”旧流并在一个变量上有多个流的情况下绑定新流吗?
使用update()
喜欢
void() { foo = newData; update(); }
或使用 ProgressIndicator
像
RxBool loading = false.obs
void Foo() { loading.value = true; your logic... loading.value = false; }
并在 UI 中使用 controller.loading.value
检查进度并在加载完成时显示
我终于解决了我的问题。潜在的问题是我将多个流绑定到一个变量,因此只要其中一个流被触发,该变量就会更新。解决方案如下:
- 创建变量的
RxList
:
final _openDepartureList = RxList<RxList<Departure>>();
- 为该列表的最后一个元素创建一个 getter:
RxList<Departure> get openDepartures => _openDepartureList.last;
- 删除旧项目:
if (_openDepartureList.length >= 2) {
_openDepartureList.removeRange(0, _openDepartureList.length - 1);
}
- 向列表中添加一个空
RxList
_openDepartureList.add(RxList.empty());
- 将流绑定到列表的最后一个元素,即刚刚添加的元素
_openDepartureList.last.bindStream():
就是这样!我现在总是将正确的流绑定到我想要的变量,并且没有多个流控制一个变量。
我有两个包含自定义模型的 RxLists:
var openDepartures = RxList<Departure>([]);
var finishedDepartures = RxList<Departure>([]);
我绑定一个流以使用来自 firebase 的值填充这些 RxList。由于我的流(我绑定到变量)根据用户的选择而变化,我将新流绑定到同一个变量,但由于这会导致两个流控制一个变量,我在此之前“重置”变量:
openDepartures = RxList<Departure>();
finishedDepartures = RxList<Departure>();
....
openDepartures.bindStream(
Database().getOpenDepartures(
userController.userLocation.value,
),
);
finishedDepartures.bindStream(
Database().getFinishedDepartures(
userController.userLocation.value,
),
);
问题是 UI 没有刷新,但是当我不“重置”变量时,一切正常。同样奇怪的是,变量确实填充了正确的数据。它只是没有显示在 UI.
中我尝试解决的问题:
- update() 方法
- Get.reloadAll()
- 对变量调用 .refresh()
- 重新配置并初始化控制器
我现在的问题是,如何让屏幕刷新,或者有人知道如何在不“重置”旧流并在一个变量上有多个流的情况下绑定新流吗?
使用update()
喜欢
void() { foo = newData; update(); }
或使用 ProgressIndicator
像
RxBool loading = false.obs
void Foo() { loading.value = true; your logic... loading.value = false; }
并在 UI 中使用 controller.loading.value
检查进度并在加载完成时显示
我终于解决了我的问题。潜在的问题是我将多个流绑定到一个变量,因此只要其中一个流被触发,该变量就会更新。解决方案如下:
- 创建变量的
RxList
:
final _openDepartureList = RxList<RxList<Departure>>();
- 为该列表的最后一个元素创建一个 getter:
RxList<Departure> get openDepartures => _openDepartureList.last;
- 删除旧项目:
if (_openDepartureList.length >= 2) {
_openDepartureList.removeRange(0, _openDepartureList.length - 1);
}
- 向列表中添加一个空
RxList
_openDepartureList.add(RxList.empty());
- 将流绑定到列表的最后一个元素,即刚刚添加的元素
_openDepartureList.last.bindStream():
就是这样!我现在总是将正确的流绑定到我想要的变量,并且没有多个流控制一个变量。