我有一个状态模型,其中包含对象的集合,对象内部也有对象的集合(想想待办事项列表的集合):
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的用例吗?
我希望我的问题很清楚,如果需要更多解释,请告诉我。
答案 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(),
);
}));
}