我正在尝试使用提供商和MOBX"商店"设计我的应用。
我有一个无状态的" playerpage",它从单个可观察的"播放器"对象显示" playerstore"的数据,该对象在planserpage内提供了提供者。
。在我的应用程序的某些部分中,一个播放器页面就是所有的,但是在其他部分中,在提供播放器列表的页面浏览量中包含几个播放器页面(来自" TeamStore"(。
由于pageView一次构建了几个播放器页面,而且我一次包含一个玩家,所以这是不起作用的。
我在PageView的" OnpageChanged"中而不是" ItemBuilder"中设置了PlayerStore的播放器,从而找到了一个半工作人员,但是随后我收到了有关"如何在buililder for观察者@(numbes(中未能检测到"在构建器函数中未检测到的MOBX消息("(我假设未显示的构建播放页面(以及跳到页面时的其他一些问题,我认为必须有一种更好的方法来处理所有这些……
有人可以告诉我我出了问题的位置(无论是pageviews还是对提供商/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()),
),