Не могу изменить статус флажка в GridView Flutter с Mobx - PullRequest
1 голос
/ 03 апреля 2020

Я хочу добавить флажок для GirdView во Flutter. Данные были получены из API-атрибута include selected по умолчанию false . Когда я нажимаю на флажок каждого элемента, он меняет значение True и обновляет пользовательский интерфейс, и я использую Mobx для наблюдения за этими действиями по изменению. Когда я отлаживал значения, которые были изменены, но пользовательский интерфейс не обновлялся, я действительно не знаю причину. Ниже я добавил 2 картинки для интерфейса и модели Mobx.

API:

{
    "name": "HuynhDuy Phuc",
    "birthday": "None",
    "phone": "N/A",
    "isSelected": false
},
{
    "name": "Doan Phuc",
    "birthday": "None",
    "phone": "N/A",
    "isSelected": false
},
{
    "name": "Phuc Vu",
    "birthday": "None",
    "phone": "N/A",
    "isSelected": false
},
    final _userApiPresenter = Provider.of<UserApiPresenter>(context);
    _userApiPresenter.fetchUsersList();

Observer(
                  name: 'ListHomePage',
                  builder: (BuildContext context) {
                    return (_userApiPresenter.userAPI != null)
                        ? AnimationLimiter(
                            child: GridView.builder(
                              physics: BouncingScrollPhysics(),
                              padding: EdgeInsets.all(12),
                              addAutomaticKeepAlives: true,
                              //Determine the number of cells per row
                              gridDelegate:
                                  new SliverGridDelegateWithFixedCrossAxisCount(
                                      crossAxisCount: 3),
                              itemCount:
                                  _userApiPresenter.userAPI.users.length,
                              itemBuilder: (context, index) {
                                User user =
                                    _userApiPresenter.getUser(index: index);
                                return AnimationConfiguration.staggeredGrid(
                                  position: index,
                                  duration:
                                      const Duration(milliseconds: 375),
                                  columnCount: 2,
                                  child: Container(
                                    child: ScaleAnimation(
                                      child: GestureDetector(
                                        child: Stack(
                                          children: <Widget>[
                                            UserItem(
                                              name: user.name,
                                              type: user.name,
                                              phone: user.phone,
                                              birthday: user.birthday,
                                              isSelected: user.selected,
                                            ),
                                            Align(
                                              alignment: Alignment.topRight,
                                              child: Checkbox(
                                                value: user.selected,
                                                onChanged: (_) {
                                                    if(user.selected){
                                                      _userApiPresenter.changeStatusCheckBox(index: index);
                                                    } else{
                                                      _userApiPresenter.changeStatusCheckBox(index: index);
                                                    }
                                                },
                                              ),
                                            ),
                                          ],
                                        ),
                                        onTap: () {
                                          Navigator.push(
                                            context,
                                            MaterialPageRoute(
                                              builder:
                                                  (BuildContext context) =>
                                                      UserDetailPage(
                                                index: index,
                                                name: user.name,
                                              ),
                                            ),
                                          );
                                        },
                                      ),
                                    ),
                                  ),
                                );
                              },
                            ),
                          )
                        : Center(
                            child: CircularProgressIndicator(),
                          );
                  },
                )

UI

Модель Mobx

1 Ответ

0 голосов
/ 04 апреля 2020

Наблюдаемая информация о массиве пользователей и самой модели пользователя отсутствует, но вам нужно сделать (если уже нет):

  • Сделать массив пользователей также наблюдаемым - таким образом, любой Кроме того, удаление и т. д. c приведет к обновлению количества пользовательских ящиков в пользовательском интерфейсе.
  • Сделать свойство selected из User также наблюдаемым - таким образом, когда определенное пользовательское состояние "выбрано" выбрано , пользовательский интерфейс будет отображать изменение

и что-то вне topi c:

  • Вам не нужен атрибут @action в методе getUser, потому что это Метод не обновляет наблюдаемые данные

Если этот ответ не решит вашу проблему, пожалуйста, предоставьте реализацию userApi и User:)

...