【问题标题】:provider view model with collection of objects具有对象集合的提供者视图模型
【发布时间】:2020-06-11 22:57:42
【问题描述】:

我有一个状态模型,其中包含对象集合,其中也包含对象集合(想想待办事项列表的集合):

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 中有一个方法,它可以通过 id 找到一个 TodoList 对象,然后将项目标记为已完成。这可能看起来像这样:

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),并且在 StateModel 中有一个 TodoListState 对象的集合吗?这是 ProxyProvider 的用例吗?

我希望我的问题很清楚,如果需要更多解释,请告诉我。

【问题讨论】:

    标签: flutter flutter-provider


    【解决方案1】:

    我的方式是,当您从详细视图中弹出时,您还传递了一个值: 我等待从弹出的值回来,然后你用这个值做一些事情。这是我的代码

     @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(),
                );
              }));
    
            }
    

    【讨论】:

      猜你喜欢
      • 2010-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 2017-07-06
      • 2021-01-19
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多