Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 在Flatter中使用stream builder时出错_Flutter_Dart_Stream_Behaviorsubject_Stream Builder - Fatal编程技术网

Flutter 在Flatter中使用stream builder时出错

Flutter 在Flatter中使用stream builder时出错,flutter,dart,stream,behaviorsubject,stream-builder,Flutter,Dart,Stream,Behaviorsubject,Stream Builder,我正在使用flutter制作一个移动应用程序。我正在为这个屏幕使用stream builder。我没有理解我在代码中的错误。你能在这方面帮助我吗。我正在共享导致问题的这一行的代码和屏幕截图 var timeSelected = 'Click here'; Row( mainAxisAlignment: MainAxisAlignment.start, children: <Widge

我正在使用flutter制作一个移动应用程序。我正在为这个屏幕使用stream builder。我没有理解我在代码中的错误。你能在这方面帮助我吗。我正在共享导致问题的这一行的代码和屏幕截图

 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'),
                                  ),
                                  );
                              },)
                            ),
                          ],
                        ),
var timeSelected='单击此处';
划船(
mainAxisAlignment:mainAxisAlignment.start,
儿童:[
正文(
“时隙:”,
样式:TextStyle(颜色:Colors.white),
),
垫片(),
手势检测器(
onTap:(){
_异步输入对话框(上下文);
//_显示对话框();
},
子级:StreamBuilder(流:cartManager.getTimeSlotSelected,
initialData:timeSelected,
生成器:(上下文,异步快照){
if(snapshot.hasData){
时间显示(快照,);
}
else if(snapshot.hasrerror){
返回文本(snapshot.error.toString());
}
返回中心(
子:容器(
子项:文本(“选择时间段”),
),
);
},)
),
],
),
单击行的文本时,将显示此警报对话框:

   _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();
                    },
                  )
                ],
              );
            });
      }
\u异步输入对话框(
构建上下文上下文,
) {
返回显示对话框(
上下文:上下文,
生成器:(上下文){
返回警报对话框(
标题:中心(子项:文本(“可用时间段”),
内容:TEAlertDialogContent(),
行动:[
新扁平按钮(
子项:新文本(“取消”),
已按下:(){
Navigator.of(context.pop();
},
)
],
);
});
}
当我从showdialog中获得值时,我会将该值存储在CartManager中的streamcontroller中

 static StreamController<Timeslot> timeSlotController = BehaviorSubject();

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

  get getTimeSlotSelected{
    return timeSlotController.stream;
  }
static StreamController timeSlotController=BehaviorSubject();
所选时间段(时间段时间){
timeSlotController.sink.add(时间);
}
获取getTimeSlotSelected{
返回timeSlotController.stream;
}
我们在streamcontroller的stream属性中调用上述方法并获取快照。这是快照包含数据时调用的方法:

  Widget timeShow(AsyncSnapshot<Timeslot> snapshot ) {
    timeSelected = '${snapshot.data.firstTimeSlot}-${snapshot.data.secondTimeSlot}';
    timeslotid = snapshot.data.id.toString();
    return Text(timeSelected);
  }
小部件时间显示(异步快照快照){ timeSelected='${snapshot.data.firstTimeSlot}-${snapshot.data.secondTimeSlot}'; timeslotid=snapshot.data.id.toString(); 返回文本(所选时间); } 但我得到了一个错误:类型“BehaviorSubject”不是类型“Stream”的子类型。
请让我知道我错在哪里。我还分享了一个显示此错误的屏幕截图。

在错误状态下,您试图将类型时隙传递给一个需要字符串类型流的流生成器。您必须检查哪一个是正确的(字符串或时隙),并在两侧使用相同的类型。 显然,您的问题在timeSelected变量中。它的定义是什么?如果这是一个字符串,流生成器将推断您的流是字符串类型,这不是真的。您必须将此变量设置为时间段,因为这是您的流类型

另外,您的代码中有一个错误。如果快照有数据,则必须返回要呈现的小部件。检查以下代码:

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'),
                              ),
                              );
                          },)

你能检查我的getTimeSlotSelected()方法吗。对吗?因为这是我从stream builder调用的方法。导致问题的属性是initialData:timeSelected,即返回字符串。通过将其移除,并提供一种蒸汽发生器解决了这个问题。谢谢这就是我在回答中所指的。我很高兴这有帮助!