Flutter:(如何)我可以拥有一个每个都依赖 Provider 的小部件的 PageView 吗?
Flutter: (How) Can I have a PageView of widgets that each rely on Provider?
我正在尝试使用 Providers and MobX "Stores" 设计我的应用程序,但无法找到在可能包含在 PageView 中的小部件中使用 Providers/Stores 的正确方法。
我有一个 StatelessWidget "PlayerPage",它显示来自 "PlayerStore" 的单个可观察 "Player" 对象的数据,该 "PlayerStore" 在 PlayerPage 中提供 Provider.of.
在我的应用程序的某些部分,只有一个 PlayerPage,但在其他部分,几个 PlayerPages 包含在随播放器列表(来自 "TeamStore")提供的 PageView 中。
由于 PageView 一次构建几个 PlayerPages 而我有一个 PlayerStore 一次包含一个 Player,所以这不起作用。
我找到了一个半解决方法,即在 PageView 的 "onPageChanged" 而不是 "itemBuilder" 中设置 PlayerStore 的播放器,但随后我收到 MobX 消息“在构建器函数中没有检测到可观察对象”对于 Observer@(number)”(我假设未显示内置的 PlayerPages)以及跳转到页面时的其他一些问题,我认为必须有更好的方法来处理所有这些......
谁能告诉我哪里出了问题(无论是 PageViews 还是对 Provider/MobX 的更深层次的误解)?
class PlayerPage extends StatelessWidget {
const PlayerPage({
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
PlayerStore playerStore = Provider.of<PlayerStore>(context);
return Column(
children: <Widget>[
Observer(
builder: (_) =>
SinglePlayerStatsDisplay(
playerStore: playerStore,
),
),
Observer(
builder: (_) =>
PlayerStatControls(
playerStore: playerStore,
),
),
],
);
}
}
...
class PlayersPageViewState extends State<PlayersPageView> {
@override
void initState() {
super.initState();
_pageController = PageController(initialPage: widget.startingIndex);
widget.playerStore
.setPlayer(widget.teamStore.players[widget.startingIndex]);
}
...
body: PageView.builder(
itemBuilder: (BuildContext context, int index) => PlayerPage(),
itemCount: widget.teamStore.players.length,
onPageChanged: (index) => widget.playerStore.setPlayer(widget.teamStore.players[index]),
controller: _pageController,
)
...
}
...
abstract class _PlayerStore implements Store {
@observable
Player player;
@action
setPlayer(Player newPlayer) => player = newPlayer;
...
}
问题是您正在使用 Observer
,但没有观察到任何东西。
Observer(
builder: (_) =>
SinglePlayerStatsDisplay(
playerStore: playerStore,
),
),
虽然 playerStore
是可观察的,但您按原样传递它。
在这种情况下,根本不需要 Observer
,可以将其删除。
Observer
仅在以下情况下需要:
Observer(
builder: (_) => Text(playerStore.foo.toString()),
),
我正在尝试使用 Providers and MobX "Stores" 设计我的应用程序,但无法找到在可能包含在 PageView 中的小部件中使用 Providers/Stores 的正确方法。
我有一个 StatelessWidget "PlayerPage",它显示来自 "PlayerStore" 的单个可观察 "Player" 对象的数据,该 "PlayerStore" 在 PlayerPage 中提供 Provider.of.
在我的应用程序的某些部分,只有一个 PlayerPage,但在其他部分,几个 PlayerPages 包含在随播放器列表(来自 "TeamStore")提供的 PageView 中。
由于 PageView 一次构建几个 PlayerPages 而我有一个 PlayerStore 一次包含一个 Player,所以这不起作用。
我找到了一个半解决方法,即在 PageView 的 "onPageChanged" 而不是 "itemBuilder" 中设置 PlayerStore 的播放器,但随后我收到 MobX 消息“在构建器函数中没有检测到可观察对象”对于 Observer@(number)”(我假设未显示内置的 PlayerPages)以及跳转到页面时的其他一些问题,我认为必须有更好的方法来处理所有这些......
谁能告诉我哪里出了问题(无论是 PageViews 还是对 Provider/MobX 的更深层次的误解)?
class PlayerPage extends StatelessWidget {
const PlayerPage({
Key key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
PlayerStore playerStore = Provider.of<PlayerStore>(context);
return Column(
children: <Widget>[
Observer(
builder: (_) =>
SinglePlayerStatsDisplay(
playerStore: playerStore,
),
),
Observer(
builder: (_) =>
PlayerStatControls(
playerStore: playerStore,
),
),
],
);
}
}
...
class PlayersPageViewState extends State<PlayersPageView> {
@override
void initState() {
super.initState();
_pageController = PageController(initialPage: widget.startingIndex);
widget.playerStore
.setPlayer(widget.teamStore.players[widget.startingIndex]);
}
...
body: PageView.builder(
itemBuilder: (BuildContext context, int index) => PlayerPage(),
itemCount: widget.teamStore.players.length,
onPageChanged: (index) => widget.playerStore.setPlayer(widget.teamStore.players[index]),
controller: _pageController,
)
...
}
...
abstract class _PlayerStore implements Store {
@observable
Player player;
@action
setPlayer(Player newPlayer) => player = newPlayer;
...
}
问题是您正在使用 Observer
,但没有观察到任何东西。
Observer(
builder: (_) =>
SinglePlayerStatsDisplay(
playerStore: playerStore,
),
),
虽然 playerStore
是可观察的,但您按原样传递它。
在这种情况下,根本不需要 Observer
,可以将其删除。
Observer
仅在以下情况下需要:
Observer(
builder: (_) => Text(playerStore.foo.toString()),
),