消费者工作,选择器不工作,为什么?
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
中调用 notifyListeners
时 ListWiew
不会重新呈现。
知道哪里出了问题吗?
您在评论中提到您只是在您的赛程列表中调用 add
。这意味着您实际上每次都返回相同的 List<Fixture>
对象。然后,选择器比较对同一对象的两个引用,得出它们相同的结论,并且不会重建您的小部件。
要使 Selector 按预期工作,您需要在需要修改其内容时创建一个新的 List<Fixture>
实例:
fixtures = [...fixtures, fixtureToAdd];
notifyListeners();
这是一个带有提供程序的 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
中调用 notifyListeners
时 ListWiew
不会重新呈现。
知道哪里出了问题吗?
您在评论中提到您只是在您的赛程列表中调用 add
。这意味着您实际上每次都返回相同的 List<Fixture>
对象。然后,选择器比较对同一对象的两个引用,得出它们相同的结论,并且不会重建您的小部件。
要使 Selector 按预期工作,您需要在需要修改其内容时创建一个新的 List<Fixture>
实例:
fixtures = [...fixtures, fixtureToAdd];
notifyListeners();