Flutter :(如何)我可以拥有每个依赖提供商的小部件的页面浏览量



我正在尝试使用提供商和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()),
),

最新更新