提供者视图模型与对象集合

时间:2020-02-27 20:50:41

标签: flutter flutter-provider

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

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的用例吗?

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

1 个答案:

答案 0 :(得分:0)

我的方法是,当您从局部视图弹出时,您还传递了一个值: 我等待从弹出窗口中获取值,然后您对值进行操作。这是我的代码

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

        }