我在我的项目中使用了 getx。我有 RxList
并购买了 Obx 我在小部件上显示了我的数据:
RxList<VocabularyModel> vocabs = RxList();
和小部件:
return Scaffold(
body: SafeArea(
child: Obx(
() => ListView.builder(
// ignore: invalid_use_of_protected_member
itemCount: controller.vocabs.value.length,
itemBuilder: (context, index) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8),
在控制器中,我有方法删除词汇中的对象:
void changeToRememberState(int index) {
final upateItem = vocabs.value[index].copyWith(remember: true);
vocabs.value.removeAt(index);
// repository.changeToRememberState(index, upateItem);
}
但是当我从词汇表中删除对象时,Obx
builder 没有被触发?为什么?我从 RxList 中删除了一个元素,为什么 RxList 不触发?
答案 0 :(得分:2)
列表默认是反应式 (Rx)。因此,如果您使用 RxList
或 [].obs
,则不应使用 .value
来访问它。或者我应该说,您不应该忽略:invalid_use_of_protected_member。这就是为什么在您删除时您的 Obx
不会触发重建。因为您要移除底层 List 元素,而不是从流中移除。
除非您使用 Rx<List<VocabularyModel>>
,否则不应使用 vocabs.value
。
因此,从 .value
中删除 vocabs
将解决重建问题。
小部件:
return Scaffold(
body: SafeArea(
child: Obx(
() => ListView.builder(
itemCount: controller.vocabs.length,
itemBuilder: (context, index) {
return Padding(
padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8),
控制器:
void changeToRememberState(int index) {
final upateItem = vocabs[index].copyWith(remember: true);
vocabs.removeAt(index);
}