Я получаю сообщение об ошибке при использовании конструктора потоков во флаттере

Я делаю мобильное приложение с помощью флаттера. И я использую построитель потоков для этого экрана. Я не понимаю, что ошибаюсь в коде. Не могли бы вы помочь мне в этом. Я использую код и снимок экрана для этой конкретной строки, которая вызывает проблему.

 var timeSelected = 'Click here';

Row(
                          mainAxisAlignment: MainAxisAlignment.start,
                          children: <Widget>[
                            Text(
                              'Time Slot:',
                              style: TextStyle(color: Colors.white),
                            ),
                            Spacer(),
                            GestureDetector(
                              onTap: () {
                                _asyncInputDialog(context);
                                //_displayDialog();
                              },
                              child: StreamBuilder(stream: cartManager.getTimeSlotSelected,
                                initialData: timeSelected,
                                builder: (context, AsyncSnapshot snapshot) {
                                if (snapshot.hasData){
                                 timeShow(snapshot,);
                                }
                                else if (snapshot.hasError) {
                                  return Text(snapshot.error.toString());
                                  }
                                  return Center(
                                  child: Container(
                                  child: Text('Select time slot'),
                                  ),
                                  );
                              },)
                            ),
                          ],
                        ),

Это диалоговое окно с предупреждением отобразится, когда я нажму на текст строки:

   _asyncInputDialog(
        BuildContext context,
      ) {
        return showDialog(
            context: context,
            builder: (context) {
              return AlertDialog(
                title: Center(child: Text('Available Time Slot')),
                content: TEAlertDialogContent(),
                actions: <Widget>[
                  new FlatButton(
                    child: new Text('CANCEL'),
                    onPressed: () {
                      Navigator.of(context).pop();
                    },
                  )
                ],
              );
            });
      }

Когда я получу значение из showdialog, я сохраню значение в streamcontroller, который присутствует в CartManager.

 static StreamController<Timeslot> timeSlotController = BehaviorSubject();

  timeSlotSelected(Timeslot time){
    timeSlotController.sink.add(time);
  }

  get getTimeSlotSelected{
    return timeSlotController.stream;
  }

И мы вызываем вышеуказанный метод в свойстве stream контроллера stream и получаем снимок. Это метод, который вызывается, когда в нашем снимке есть данные:

  Widget timeShow(AsyncSnapshot<Timeslot> snapshot ) {
    timeSelected = '${snapshot.data.firstTimeSlot}-${snapshot.data.secondTimeSlot}';
    timeslotid = snapshot.data.id.toString();
    return Text(timeSelected);
  }

Но я получаю сообщение об ошибке: тип BehaviorSubject не является подтипом типа Stream. Сообщите мне, в чем я ошибаюсь. Я также поделился снимком экрана, показывающим эту ошибку.  скриншот ошибки


person Umair    schedule 20.12.2019    source источник


Ответы (1)


Как указано в вашей ошибке, вы пытаетесь передать тип Timeslot конструктору Stream, ожидающему поток типа String. Вы должны проверить, какой из них правильный (строка или временной интервал), и использовать один и тот же тип с обеих сторон. Видимо, ваша проблема в переменной timeSelected. Где это определяется? Если это String, построитель Stream сделает вывод, что ваш поток имеет тип String, что неверно. Вы должны установить эту переменную как временной интервал, поскольку это ваш тип потока.

Кроме того, в вашем коде есть ошибка. Вы должны вернуть виджет для рендеринга, если в снимке есть данные. Проверьте код ниже:

StreamBuilder(stream: cartManager.getTimeSlotSelected,
                            initialData: timeSelected,
                            builder: (context, AsyncSnapshot snapshot) {
                            if (snapshot.hasData){
                             return timeShow(snapshot,);
                            }
                            else if (snapshot.hasError) {
                              return Text(snapshot.error.toString());
                              }
                              return Center(
                              child: Container(
                              child: Text('Select time slot'),
                              ),
                              );
                          },)
person dcg    schedule 20.12.2019
comment
Можете ли вы проверить мой метод getTimeSlotSelected (). Это правильно? потому что это метод, который я вызываю из построителя потоков. - person Umair; 20.12.2019
comment
Свойство, вызывающее проблему, - это initialData: timeSelected, которое возвращает строку. Убрав это оттуда и указав тип steambuilder, я решил проблему. Спасибо - person Umair; 23.12.2019
comment
Это то, на что я указал в своем ответе. Я рада, что помогло! - person dcg; 23.12.2019