【问题标题】:I am getting error while using stream builder in flutter在颤振中使用流生成器时出现错误
【发布时间】:2020-04-13 00:34:59
【问题描述】:

我正在使用颤振制作移动应用程序。我正在为这个屏幕使用流生成器。我没有明白我在代码中出错的地方。你能帮我解决这个问题吗?我正在共享导致问题的特定行的代码和屏幕截图

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

但我收到错误:type 'BehaviorSubject' 不是 type 'Stream' 的子类型 请让我知道我错在哪里。我还分享了一个显示此错误的屏幕截图。

【问题讨论】:

    标签: flutter dart stream behaviorsubject stream-builder


    【解决方案1】:

    正如您的错误所述,您正在尝试将类型 Timeslot 传递给期望 String 类型流的 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() 方法吗?这是正确的吗?因为这是我从流生成器调用的方法。
    • 导致属性的问题是initialData:timeSelected,即返回字符串。通过从那里删除它并提供蒸汽发生器类型解决了这个问题。谢谢你
    • 这就是我在回答中所指出的。我很高兴它有帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-06-25
    • 2022-10-18
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2020-08-25
    • 2020-04-01
    相关资源
    最近更新 更多