使用 BlocBuilder 的 StatefulWidget 不会在状态更改时重建

StatefulWidget using BlocBuilder doesn't rebuild on state change

我正在使用 Flutter(BloC 模式)构建一个流式传输多个摄像头源的小部件。单击提要时,它会显示在主提要中(想想 Google 视频群聊,其中发言者的脸显示在前面和中间,而其他人则较小)。

尝试切换所选提要时,BlocMapEventToState 会使用预期的新值生成状态 (int);然而,主 CamFeed 小部件不会切换提要。

我对 StatefulWidget 的这种用法的理解是 returns 和 BlocBuilder<CamSwitcherBloc, int> 应该 在更改该 int 时重建。相反,似乎什么都没有发生。 build() 仅在首次创建时被调用,并且在 CamFeed 中的一个子项的状态正在更新时被调用。

我已经通过天文台确认,正如预期的那样,只有一个 CamSwitcherBloc 实例。

所以 - 我是不是想错了:

当我的 Bloc 中的 MapEventToState 产生一个新值(selectedCam,在下面输入构建器)时,应该为我的小部件调用 build()

如果那是正确的,任何关于在哪里继续我的狩猎的建议将不胜感激。

谢谢!

class CamSwitcher extends StatefulWidget {
  @override
  _CamSwitcherState createState() => _CamSwitcherState();
}

class _CamSwitcherState extends State<CamSwitcher> {

  @override
  Widget build(BuildContext context) {

    final camSwitcherBloc = BlocProvider.of<CamSwitcherBloc>(context);

    return BlocBuilder<CamSwitcherBloc, int>(
      builder: (context, selectedCam) => Stack(
        children: <Widget>[
          Container(
            width: 1200,
            height: 800,
            child: CamFeed(
              topic: camSwitcherBloc.cameras[selectedCam],
            ),
          ),
          Row(
            children: <Widget>[
              Container(
                width: 180,
                height: 120,
                child: CamFeed(
                  topic: CamSwitcherBloc.cam1,
                  focuser: () {
                    camSwitcherBloc.dispatch(ExpandCamera(0));
                  },
                ),
              ),
              Container(
                width: 180,
                height: 120,
                child: CamFeed(
                  topic: CamSwitcherBloc.cam2,
                  focuser: () {
                    camSwitcherBloc.dispatch(ExpandCamera(1));
                  },
                ),
              ),
            ],
          ),
        ],
      ),
    );
  }
}

原来这与 CamFeed 小部件有关。切换后,它确实订阅了新的提要,但并没有取消订阅旧的提要。这是 CamFeed 工作方式的症状,不太可能对其他读者有用。

可能与其他人相关: 在这种情况下,虽然 CamSwitcherBloc 没有重建(虽然我预计会重建),但它的 child (Camfeed) 实际上是,正如预期的那样。