Я пытаюсь создать свое приложение с провайдерами и 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;
...
}