我正在编写一个Flutter应用程序,其中向用户显示一个PageView小部件,该部件允许他/她通过滑动在3个“页面”之间导航。
我遵循https://medium.com/flutter-community/flutter-app-architecture-101-vanilla-scoped-model-bloc-7eff7b2baf7e中使用的设置,在该设置中,我使用单个类将数据加载到模型中,该模型应反映相应的状态变化(IsLoadingData / HasData)。
我有一个主页,其中包含所有ViewPage小部件。页面是在MainPageState对象中构造的,如下所示:
@override
void initState() {
_setBloc = SetBloc(widget._repository);
_notificationBloc = NotificationBloc(widget._repository);
leftWidget = NotificationPage(_notificationBloc);
middleWidget = SetPage(_setBloc);
currentPage = middleWidget;
super.initState();
}
如果我们进入NotificationPage,那么它要做的第一件事就是尝试加载数据:
NotificationPage(this._notificationBloc) {
_notificationBloc.loadNotificationData();
}
which should be reflected in the build function when a user directs the application to it:
//TODO: Consider if state management is correct
@override
Widget build(BuildContext context) {
return StreamBuilder<NotificationState>(
stream: _notificationBloc.notification.asBroadcastStream(),
//initialData might be problematic
initialData: NotificationLoadingState(),
builder: (context, snapshot) {
if (snapshot.data is NotificationLoadingState) {
return _buildLoading();
}
if (snapshot.data is NotificationDataState) {
NotificationDataState state = snapshot.data;
return buildBody(context, state.notification);
} else {
return Container();
}
},
);
}
发生的事情是,即使已加载数据,屏幕也会始终打“ NotificationLoadingState”,这在存储库中发生:
void loadNotificationData() {
_setStreamController.sink.add(NotificationState._notificationLoading());
_repository.getNotificationTime().then((notification) {
_setStreamController.sink
.add(NotificationState._notificationData(notification));
print(notification);
});
}
该通知同时打印在不是通知页面的另一页上。
我在做什么错了?
答案 0 :(得分:0)
//....
class _SomeState extends State<SomeWidget> {
//....
Stream<int> notificationStream;
//....
@override
void initState() {
//....
notificationStream = _notificationBloc.notification.asBroadcastStream()
super.initState();
}
//....
Widget build(BuildContext context) {
return StreamBuilder<NotificationState>(
stream: notificationStream,
//....
将您的Stream保存在某处,并每次都停止对其进行初始化。 我怀疑build方法会被多次调用,因此您会创建一个新的流(initState被调用一次)。
请尝试让我知道是否有帮助。