使用 BlocBuilder 的 StatefulWidget 不会在状态更改时重建
StatefulWidget using BlocBuilder doesn't rebuild on state change
我正在使用 Flutter(BloC 模式)构建一个流式传输多个摄像头源的小部件。单击提要时,它会显示在主提要中(想想 Google 视频群聊,其中发言者的脸显示在前面和中间,而其他人则较小)。
尝试切换所选提要时,Bloc
的 MapEventToState
会使用预期的新值生成状态 (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
) 实际上是,正如预期的那样。
我正在使用 Flutter(BloC 模式)构建一个流式传输多个摄像头源的小部件。单击提要时,它会显示在主提要中(想想 Google 视频群聊,其中发言者的脸显示在前面和中间,而其他人则较小)。
尝试切换所选提要时,Bloc
的 MapEventToState
会使用预期的新值生成状态 (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
) 实际上是,正如预期的那样。