Flutter:从构建方法外部访问Bloc数据

时间:2019-05-25 08:41:43

标签: flutter bloc

我可以从构建方法之外访问Bloc流中的数据吗?

例如,在build方法中,我可以使用snapShot.data访问数据。像这样:

return StreamBuilder(
      //initialData: Colors.blue,
      stream: colorBloc.colorStream,
      builder: (BuildContext context, snapShot) => Container(
        width: menuButtonSize,
        height: menuButtonSize,
        decoration: BoxDecoration(
          shape: BoxShape.circle,
          color: snapShot.data,  //This returns the correct colour previously stored in this stream.
          boxShadow: [
            BoxShadow(
              color: Colors.black,
              blurRadius: 15,
            ),
          ],
        ),
      ),
    );

但是要对另一个我要工作的Bloc实例进行故障排除,我希望能够以某种方式打印出snapShot.data的当前值,这样我就可以看到它在做什么以及它是否正确更新,因为目前无法使用。

当前无效的Bloc代码段

  Widget customTheme() {
    return StreamBuilder(
      initialData: true,
      stream: customToggleBloc.customToggleStream,
      builder: (BuildContext context, snapShot) => GestureDetector(
        onTap: (){
          snapShot.data == true ? widget?._callback('custom') : widget?._callback('clearcustom');  //Section A
        },
        child: Container(
          width: menuButtonSize + 8,
          height: menuButtonSize + 8,
          decoration: BoxDecoration(
            shape: BoxShape.circle,
            color: AppState.brownTheme,
            boxShadow: [
              BoxShadow(
                color: Colors.black,
                blurRadius: 25,
              ),
            ],
          ),
          child: new IconTheme(
            data: new IconThemeData(
                color: Colors.white,
                size: 35,
            ),
            child: snapShot.data == true ? new Icon(Icons.add_photo_alternate) : new Icon(Icons.cancel),  // Section B
          ),
        ),
      ),
    );
  }

所以我想做的是有一个始终处于两种状态之一的按钮。 1)它显示Icons.add_photo_alternate并允许您从图库中选择图像; 2)显示Icons.cancel并删除以前选择的图像。 A部分处理onPress事件选项,B部分处理显示的图标。

我真正得到的始终是Icons.add_photo_alternate,在按下时实际上会触发这两个备用代码块。

因此,我真的很希望能够访问此数据,以查看可能出问题的地方!

我正在尝试类似的变化形式

print(customToggleBloc.customToggleSink.toString());  

哪个返回:

Instance of '_StreamSinkWrapper<bool>'

而不是里面的值。甚至可以访问此信息吗?

1 个答案:

答案 0 :(得分:0)

我认为此行为是由于您的stream不返回任何数据,因此依赖于您提供的initialData构建其子级。可以肯定的是,您可以删除{{1} },然后将initialDate: true包裹在StreamBuilder中,以检查数据是否存在:如果数据可用,则会构建builder,如果没有{{1} }将显示在中间。这样,您将知道if-else发生了什么事情:

GestureDetector