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

Posted

技术标签:

【中文标题】从 Selector 访问多个字段(在 Flutter 中使用 Provider 状态管理时)?【英文标题】:Access multiple fields from Selector (when using Provider state management in Flutter)? 【发布时间】:2020-05-01 15:06:13 【问题描述】:

我有一个任务管理器应用程序,它在 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,
  ),
]);

  

【问题讨论】:

【参考方案1】:

如the documentation of Selector 所述,您应该创建一个自定义类或使用包tuple

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

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

【讨论】:

您能详细说明一下吗?我遇到了同样的问题,我使用元组来比较对象中的字段。但是当我想使用相同的方法来比较两个对象时,我感到很困惑。如果我有一个 List _users,并且我想在每次添加到列表时重建或在更改列表中的一个对象时重建 ListTile,我该怎么做?

以上是关于从 Selector 访问多个字段(在 Flutter 中使用 Provider 状态管理时)?的主要内容,如果未能解决你的问题,请参考以下文章

访问:多值字段

jQuery Chosen:在同一页面上显示多个选择字段

包含来自访问中的多个字段的数据的组合框

Selector选择器

Selector选择器

将 collectionview 从函数传递到 Selector (UILongPressGestureRecognizer)