[英]I am getting error builder.payload while connecting to mqtt in Flutter
[英]I am getting error while using stream builder in flutter
我正在使用颤振制作移动应用程序。 我正在为此屏幕使用流构建器。 我没有明白我在代码中出错的地方。 你能帮我解决这个问题吗? 我正在共享此特定行的代码和屏幕截图,这导致了问题
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 获得值时,我会将值存储在 CartManager 中存在的流控制器中。
static StreamController<Timeslot> timeSlotController = BehaviorSubject();
timeSlotSelected(Timeslot time){
timeSlotController.sink.add(time);
}
get getTimeSlotSelected{
return timeSlotController.stream;
}
并且我们在streamcontroller的stream属性中调用上面的方法并获取快照。 这是当我们的快照有数据时调用的方法:
Widget timeShow(AsyncSnapshot<Timeslot> snapshot ) {
timeSelected = '${snapshot.data.firstTimeSlot}-${snapshot.data.secondTimeSlot}';
timeslotid = snapshot.data.id.toString();
return Text(timeSelected);
}
但我收到错误: “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'),
),
);
},)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.