Flutter: доступ к данным Bloc извне метода сборки - PullRequest
0 голосов
/ 25 мая 2019

Могу ли я получить доступ к данным в потоках Bloc извне метода сборки?

Например, в методе сборки я могу получить доступ к данным с помощью 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, чтобы я мог увидеть, что этоделает, и если он обновляется должным образом, потому что в настоящее время он не работает.

Текущий фрагмент нерабочего блока:

  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 голосов
/ 25 мая 2019

Я думаю, что такое поведение вызвано тем, что stream не возвращает никаких данных и, таким образом, полагается на initialData, предоставленный вами для создания его дочерних элементов. Чтобы быть уверенным, вы можете удалить initialDate: true из вашего StreamBuilder и оберните тело builder с if-else, чтобы проверить существование данных: если данные доступны, ваш GestureDetector будет построен, если нет, то в середине будет отображаться CircularProgressIndicator. Таким образом, вы будете знать, что происходит с вашим stream:

   Widget customTheme() {
    return StreamBuilder(
      //initialData: true,
      stream: customToggleBloc.customToggleStream,
      builder: (BuildContext context, snapShot) {
        if(snapShot.hasData){
          print(snapShot.data.toString());
          return GestureDetector(
             onTap: (){
               widget?._callback(snapShot.data == true ? 'custom' : '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:  Icon(snapShot.data == true ? Icons.add_photo_alternate : Icons.cancel),  // Section B
              ),
            ),
          );
        }else{
          return Center(
            child: CircularProgressIndicator(),
         );
       }
     }
   );
 }
...