Изменение свойства дочерних элементов не вызывает изменение пользовательского интерфейса на 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;

Другие вопросы по тегам