从另一个窗口小部件更改一个窗口小部件的状态

时间:2019-08-09 13:37:00

标签: flutter stream bloc

我正在编写一个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);
    });
  }

该通知同时打印在不是通知页面的另一页上。

我在做什么错了?

1 个答案:

答案 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被调用一次)。

请尝试让我知道是否有帮助。