модель представления провайдера с коллекцией объектов - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть модель состояния, в которой есть коллекция объектов, в которой также есть коллекция объектов (подумайте о коллекции списков задач):

class StateModel extends ChangeNotifier {
    List<TodoList> todoLists;
}

Упрощенный класс TodoList выглядит следующим образом:

class TodoList {
    int id;
    List<Item> items;
}

class Item {
    int id;
    String name;
    bool status; // true is done, false is not done
}

Теперь одним из моих видов является ListView моих списков задач (где я отображаю только имя), и это восток. Но я хочу иметь детальное представление списка задач (где отображаются данные одного списка задач), где я хочу пометить элементы списка задач как выполненные (т.е. установить их статус в значение true). как мне это сделать? Я мог бы иметь метод в StateModel, который бы находил объект TodoList по id, а затем помечал элементы как выполненные. Это может выглядеть примерно так:

class StateModel extends ChangeNotifier {
    // (...)
    void markItemAsDone(listId, itemId) {
        // find todo list in StateModel
        // find item in given list
        // mark it as done
        // notifyListeners()
    }
}

Но это кажется неправильным. То, что я хотел бы иметь, это способ получить модель представления объекта TodoList и использовать ее методы, а не методы StateModel. Как мне подойти к этому? Могу ли я иметь другую модель представления (TodoListState) и иметь коллекцию объектов TodoListState в StateModel? Это вариант использования ProxyProvider?

Надеюсь, мой вопрос ясен, дайте мне знать, если это требует дополнительных объяснений.

1 Ответ

0 голосов
/ 28 февраля 2020

По-моему, когда вы возвращаетесь из подробного представления, вы также передаете значение: I жду для значения из всплывающего окна, затем вы что-то делаете со значением. Вот мой код

 @override
  Widget build(BuildContext context) {
    WordModel provider = Provider.of<WordModel>(context);
    return Consumer<WordModel>(
      builder: (BuildContext context, value, Widget child) => InkWell(
        onTap: () async {
          dynamic status = await Navigator.of(context).push(PageRouteBuilder<ListFavouriteWord>(
               pageBuilder: (BuildContext context, Animation<double> animation,
                  Animation<double> secondaryAnimation) {
            return ListFavouriteWord(value);
          }));
          //do something with markedValue
          //provider.update(status)

        },
        child: Padding(
          padding: const EdgeInsets.only(top: 16.0, right: 16.0),
          child: Badge(
            child: Icon(Icons.face),
            badgeContent: Text(
              "${value.counter}",
              style: Theme.of(context)
                  .textTheme
                  .button
                  .copyWith(color: Colors.white, fontSize: 10.0),
            ),
          ),
        ),
      ),
    );
  }

Я нашел другой способ сделать это. Вам просто нужно: ChangeNotifierProvider.value(), чтобы использовать своего провайдера на предыдущем маршруте

Мой код:

onTap: () async {
          dynamic markedValue = await Navigator.of(context).push(
              PageRouteBuilder<ListFavouriteWord>(
         pageBuilder: (BuildContext context, Animation<double> animation,
                      Animation<double> secondaryAnimation) {
            return ChangeNotifierProvider.value(
              value: value,
              child: ListFavouriteWord(),
            );
          }));

        }
...