Флаттер: (Как) Могу ли я иметь PageView виджетов, каждый из которых зависит от провайдера? - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь создать свое приложение с провайдерами и MobX "Stores" , и не могу найти правильный способ использования провайдеров / хранилищ в виджетах, которые могут бытьвключены в PageView.

У меня есть StatelessWidget «PlayerPage», который отображает данные из одного наблюдаемого объекта «Player» из «PlayerStore», который предоставляется внутри PlayerPage с Provider.of.

В некоторых частяхВ моем приложении одна PlayerPage - это все, что есть, но в других частях несколько PlayerPages содержатся в PageView, снабженном списком игроков (из «TeamStore»).

Поскольку PageView создает несколько PlayerPages ввремя, и у меня есть один PlayerStore, содержащий один Player за раз, это не сработало.

Я разобрался с полуобходом, установив PlayerStore Player в «OnPageChanged» PageView, а не «itemBuilder», но затем я получаю сообщения MobX о том, что «в функции построителя для Observer @ (число)» не обнаружены наблюдаемые объекты (я полагаю из встроенных PlayerPages, которые не показаны), а также некоторые другие проблемы при переходе на страницу, и яЯ думаю, что должен быть лучший способ справиться со всем этим ...

Может кто-то угодитьСкажите мне, где я ошибся (будь то с 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;

  ...
}

1 Ответ

1 голос
/ 15 мая 2019

Проблема в том, что вы используете Observer, но ничего не наблюдаете.

Observer(
  builder: (_) =>
      SinglePlayerStatsDisplay(
        playerStore: playerStore,
      ),
),

Пока playerStore можно наблюдать, вы передаете его как . В этом случае Observer вообще не нужен и может быть удален.

Observer понадобится только для чего-то вроде:

Observer(
  builder: (_) => Text(playerStore.foo.toString()),
),
...