Flutter 在Flatter中使用stream builder时出错
我正在使用flutter制作一个移动应用程序。我正在为这个屏幕使用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
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,即返回字符串。通过将其移除,并提供一种蒸汽发生器解决了这个问题。谢谢这就是我在回答中所指的。我很高兴这有帮助!