Изменение свойства дочерних элементов не вызывает изменение пользовательского интерфейса на Flutter Getx
Я пытаюсь отобразить реактивный виджет на основе списка объектов.
Мне нужно, чтобы при изменении логического свойства дочерних элементов этого объекта пользовательский интерфейс обновлялся.
В этом сценарии мой контроллер имеет список разделов, и в каждом разделе есть список уроков.
Для лучшего понимания я переписываю свой код на простом примере, исходя из того, что мне нужно. Я уже пробую использовать.map,.forEach и другие подходы, но свойство children никогда не запускает обновление пользовательского интерфейса.
GetX<LessonController>(
initState: (state) => controller.getLessonsByCourse(course.id),
builder: (_) {
return Expanded(
child: ListView.separated(
scrollDirection: Axis.vertical,
itemCount: _.sectionList.length,
itemBuilder: (BuildContext context, int index) {
return ExpansionTile(
title: Text(_.sectionList[index].title),
children: <Widget>[
for(var i = 0; i < _.sectionList[index].lessons.length; i++)
Padding(
padding: const EdgeInsets.all(8.0),
child:
Obx(() =>
GestureDetector(
child: Text((_.sectionList[index].lessons[i] as Lesson).isCompleted.toString()),
onTap: () {
(_.sectionList[index].lessons[i] as Lesson).isCompleted = !(_.sectionList[index].lessons[i]as Lesson).isCompleted;
print((_.sectionList[index].lessons[i]as Lesson).isCompleted.toString());
})
),
)
]);
},
separatorBuilder: (context, ind) => Divider(
height: 2,
color: Colors.grey[300],
),
),
);
})
2 ответа
Насколько я могу судить, наблюдаемый список во Flutter GetX не касается внутренних изменений объектов.
Чтобы принудительно обновить пользовательский интерфейс, мне пришлось вернуть обновленный объект в ту же позицию в списке, чтобы сделать вид, что произошли изменения в объектах в основном списке.
Что-то такое:
Section tappedSection = _.sectionList[index];
tappedSection.lessons[i].isCompleted = value;
_.notifyLessonProgress(tappedSection.lessons[i].id, value);
_.sectionList[index] = tappedSection;
Похоже, проблема здесь:this._sectionList.value = value;
Попробуйте вместо этого:this._sectionList = value;