消费者工作,选择器不工作,为什么?

Consumer works, Selector doesn't, why?

这是一个带有提供程序的 flutter 小部件:

class FixtureList extends StatelessWidget {
  const FixtureList({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Consumer<AppState>(
      builder: (context, appState, _) => ListView(
        children: appState.fixtures.isNotEmpty
            ? appState.fixtures
                .map((e) => FixtureListItem(
                      fixtureId: e.name,
                    ))
                .toList()
            : [],
      ),
    );
  }
}

效果很好,但我只使用 appState.fixtures,所以为什么不只用 Selector 听那部分,就像这样:

  @override
  Widget build(BuildContext context) {
    return Selector<AppState, List<Fixture>>(
      selector: (context, appState) => appState.fixtures,
      builder: (context, fixtures, _) => ListView(
        children: fixtures.isNotEmpty
            ? fixtures
                .map((e) => FixtureListItem(
                      fixtureId: e.name,
                    ))
                .toList()
            : [],
      ),
    );
  }

这不起作用,在 AppState 中调用 notifyListenersListWiew 不会重新呈现。

知道哪里出了问题吗?

您在评论中提到您只是在您的赛程列表中调用 add。这意味着您实际上每次都返回相同的 List<Fixture> 对象。然后,选择器比较对同一对象的两个引用,得出它们相同的结论,并且不会重建您的小部件。

要使 Selector 按预期工作,您需要在需要修改其内容时创建一个新的 List<Fixture> 实例:

fixtures = [...fixtures, fixtureToAdd];
notifyListeners();