从 Selector 访问多个字段(在 Flutter 中使用 Provider 状态管理时)?
Access multiple fields from Selector (when using Provider state management in Flutter)?
我有一个任务管理器应用程序,它在 ListView 中显示许多 TaskWidget 小部件,目前正在尝试修改我的应用程序以使用 Provider 进行状态管理。我有一个 TaskListModel class 作为我的 ChangeNotifier,它包含一个 TaskModel 列表以及一些调用 notifyListeners() 的 getter 和 setter。 (TaskModel 不是 ChangeNotifier)
当用户修改列表中单个任务的数据时,我想重建该小部件而不重建列表中的所有其他小部件。 Selector 几乎可以满足我的要求,除了我需要访问 TaskModel 中的所有字段以重建相应的 TaskWidget,而 Selector 似乎只能处理单个字段。我尝试通过使用列表索引将选择器设置为 TaskModel 的实例来使用 Selector。我认为这不起作用,因为它正在监听 TaskModel 的引用(不会更改)而不是 TaskModel 中的所有字段。有没有一种直接的方法可以让我做到这一点?我在下面包含了 TaskWidget 的构建方法以供参考。
Widget build(BuildContext context) {
return Column(children: <Widget>[
Selector<TaskListModel, TaskModel>(
selector: (_, taskListModel) => taskListModel.taskList[index],
builder: (_, taskModel, child) {
print("rebuilding " + index.toString());
return Material(
color: taskModel.color,
child: ListTile(
title: Column(children: <Widget>[
Text(
taskModel.name,
style: _taskFont,
textAlign: TextAlign.center,
),
Text(
taskModel.formattedTime,
style: _taskFont,
textAlign: TextAlign.center,
),
]),
),
);
},
),
Divider(
height: 0.0,
),
]);
}
如 the documentation of Selector 所述,您应该自定义 class 或使用包 tuple
。
To select multiple values without having to write a class that implements ==, the easiest solution is to use a "Tuple" from tuple:
Selector<Foo, Tuple2<Bar, Baz>>(
selector: (_, foo) => Tuple2(foo.bar, foo.baz),
builder: (_, data, __) {
return Text('${data.item1} ${data.item2}');
}
)
我有一个任务管理器应用程序,它在 ListView 中显示许多 TaskWidget 小部件,目前正在尝试修改我的应用程序以使用 Provider 进行状态管理。我有一个 TaskListModel class 作为我的 ChangeNotifier,它包含一个 TaskModel 列表以及一些调用 notifyListeners() 的 getter 和 setter。 (TaskModel 不是 ChangeNotifier)
当用户修改列表中单个任务的数据时,我想重建该小部件而不重建列表中的所有其他小部件。 Selector 几乎可以满足我的要求,除了我需要访问 TaskModel 中的所有字段以重建相应的 TaskWidget,而 Selector 似乎只能处理单个字段。我尝试通过使用列表索引将选择器设置为 TaskModel 的实例来使用 Selector。我认为这不起作用,因为它正在监听 TaskModel 的引用(不会更改)而不是 TaskModel 中的所有字段。有没有一种直接的方法可以让我做到这一点?我在下面包含了 TaskWidget 的构建方法以供参考。
Widget build(BuildContext context) {
return Column(children: <Widget>[
Selector<TaskListModel, TaskModel>(
selector: (_, taskListModel) => taskListModel.taskList[index],
builder: (_, taskModel, child) {
print("rebuilding " + index.toString());
return Material(
color: taskModel.color,
child: ListTile(
title: Column(children: <Widget>[
Text(
taskModel.name,
style: _taskFont,
textAlign: TextAlign.center,
),
Text(
taskModel.formattedTime,
style: _taskFont,
textAlign: TextAlign.center,
),
]),
),
);
},
),
Divider(
height: 0.0,
),
]);
}
如 the documentation of Selector 所述,您应该自定义 class 或使用包 tuple
。
To select multiple values without having to write a class that implements ==, the easiest solution is to use a "Tuple" from tuple:
Selector<Foo, Tuple2<Bar, Baz>>( selector: (_, foo) => Tuple2(foo.bar, foo.baz), builder: (_, data, __) { return Text('${data.item1} ${data.item2}'); } )