【发布时间】:2021-11-23 05:53:50
【问题描述】:
我正在开发一个使用 GetX 进行状态管理的 Flutter 项目。
我们有一些包含 List 属性的实体。简化版本类似于:
class UserFees extends Equatable {
final String userId;
final List<double> fees;
UserFees({required this.userId, this.fees = const []});
void addFee(double newFee) => fees.add(newFee);
@override
List<Object> get props => [fees];
// Alternatively, we have also tried to:
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is UserFees &&
runtimeType == other.runtimeType &&
listEquals(fees, (other as UserFees).fees);
@override
int get hashCode => // I do not remember the calculus we'd used,
// but it did at least change when new item was added;
}
这个实体在控制器中使用:
class MyController extends GetxController {
final Rx<UserFees> userFees;
void addFee(double newFee) {
userFees.addFee(newFee);
// We have tried calling update() to no effect
}
}
当我在带有 Obx 的 Widget 中使用它时,当我将项目添加到列表时它不会重建,即使对象的 hashCode 已更新。
Widget build(BuildContext context) {
return Scaffold(
body: Obx(() => Column(children:
...controller.userFees.fees.map(
(item) => Text(item.toString()
);
),
),
floatingActionButton: IconButton(
icon: const Icon(Icons.add),
onPressed: controller.addFee(0.1)
),
);
);
}
我们的团队通过将实体内部的 List 转换为 RxList 来完成这项工作,但这并不理想,因为我们不想将实体与 GetX 或 RxDart 耦合。
GetX 文档在这些细节上的内容很差,而且源代码很难理解,至少对我来说是这样。那么,任何人都可以向我解释 Obx 是如何知道可观察对象已更改的吗?它会查看 hashCode 吗?只有当我的类是不可变的并且我在将项目添加到列表时完全重建对象时,它才会重建?
【问题讨论】:
标签: flutter rxdart flutter-getx