从 Selector 访问多个字段(在 Flutter 中使用 Provider 状态管理时)?

Ben*_*Ben 1 provider selector dart flutter

我有一个任务管理器应用程序,它在 ListView 中显示许多 TaskWidget 小部件,目前我正在尝试修改我的应用程序以使用 Provider 进行状态管理。我有一个 TaskListModel 类作为我的 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,
  ),
]);

  }
Run Code Online (Sandbox Code Playgroud)

Rém*_*let 5

正如Selector 的文档所述,您应该创建自定义类或使用包tuple

要选择多个值而不必编写实现 == 的类,最简单的解决方案是使用元组中的“元组”:

Selector<Foo, Tuple2<Bar, Baz>>(
  selector: (_, foo) => Tuple2(foo.bar, foo.baz),
  builder: (_, data, __) {
    return Text('${data.item1}  ${data.item2}');
  }
)

Run Code Online (Sandbox Code Playgroud)