[英]Flutter: (How) Can I have a PageView of widgets that each rely on Provider?
我正在尝试使用Providers和MobX“ Stores”设计我的应用程序 , 但无法找出在PageView中可能包含的小部件中使用Providers / Stores的正确方法。
我有一个StatelessWidget“ PlayerPage”,它显示来自PlayerPlayer内提供有Provider.of的“ PlayerStore”中单个可观察的“ Player”对象的数据。
在我的应用程序的某些部分中,只有一个PlayerPage,但在其他部分中,PageView中包含多个PlayerPage,其中提供了Player列表(来自“ TeamStore”)。
由于PageView一次只能构建几个PlayerPage,而我一次只有一个PlayerStore包含一个Player,所以这是行不通的。
我想出了一种半解决方法,可以在PageView的“ onPageChanged”而不是“ itemBuilder”中设置PlayerStore的Player,但随后我收到了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
是可观察的,但您playerStore
原样传递它。 在这种情况下,根本不需要Observer
,可以将其删除。
Observer
只需要像这样的事情:
Observer(
builder: (_) => Text(playerStore.foo.toString()),
),
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.