【问题标题】:Cannot Get StreamBuilder Data无法获取 StreamBuilder 数据
【发布时间】:2021-12-25 06:23:36
【问题描述】:

我正在尝试从流中获取更新的数据,但是,即使我在未来的函数中获取数据,snapshot.data 也会给我这个错误:

type '_ControllerStream<dynamic>' is not a subtype of type 'Iterable<dynamic>'

这是我的函数和流:

Future getChat(orderId) async {
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var _token = prefs.getString('token');
  print('The Latest Order Token is $_token');

  final Map<String, dynamic> body = {
    "id": "$orderId",
  };
  final List _messageData = [];

  var url = Uri.parse('$_server/api/driver/get/convo/?access_token=$_token');

  await http.post(url, body: body, headers: {
    "Content-Type": 'application/x-www-form-urlencoded'
  }).then((http.Response response) {
    print(response.body);

    switch (response.statusCode) {
      case 200:
        final Map<String, dynamic> responseData = json.decode(response.body);
        print("The ${response.body}");

        var x = responseData['message_data'].split(",");

        print(x);
        for (int i = 0; i < x.length; i++) {
          _messageData.add(x[i]);
          print(x[i]);
        }
        print(x);

        break;
      default:
        final Map<String, dynamic> responseData = json.decode(response.body);
        print(responseData);
        return _messageData;
    }
    return _messageData;
  });
}


Stream getChatData(Duration refreshTime, id) async* {
  while (true) {
    await Future.delayed(refreshTime);
    yield getChat(id).asStream();
  }
}

我在数据响应中得到了这个:

"message_data": ""11-12-21:09:01:14AM - Billy Fakename: fire 测试,11-12-21:09:01:30AM - 测试员:ewserasece,""

我的流生成器​​是:

  Stream _chatStream;

  @override
  void initState() {
    _chatStream = getChatData(Duration(seconds: 3), orderid);

    super.initState();
  }

StreamBuilder(
                stream: _chatStream,
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    final messages = snapshot.data;
                    List<MessageBubble> messageWidgets = [];
                    for (var message in messages) {
                      final msgText = message;
                      final msgSender = message;
                      // final msgSenderEmail = message.data['senderemail'];
                      final currentUser = "loggedInUser.displayName";

                      // print('MSG'+msgSender + '  CURR'+currentUser);
                      final msgBubble = MessageBubble(
                          msgText: msgText,
                          msgSender: msgSender,
                          user: currentUser == msgSender);
                      messageWidgets.add(msgBubble);
                    }
                    return Expanded(
                      child: ListView(
                        reverse: true,
                        padding:
                            EdgeInsets.symmetric(vertical: 15, horizontal: 10),
                        children: messageWidgets,
                      ),
                    );
                  } else {
                    return Center();
                  }
                },
              ),

但是,我收到此错误:类型“_ControllerStream”不是“Iterable”类型的子类型,否则快照将为空。

如何获取在未来函数中显示的信息,显示在流中?

【问题讨论】:

    标签: flutter dart stream stream-builder


    【解决方案1】:

    您能告诉我们您在哪里定义 _chatStream 吗? 您的 StreamBuilder 使用 _chatStream 但您只向我们展示了您定义方法的位置

    Future getChat(orderId)
    

    方法

    Stream getChatData(Duration refreshTime, id)
    

    您在其中创建一个在您共享的代码中不使用的流。 您想在 StreamBuilder 中使用 getChatData 吗? 我错过了什么吗?

    【讨论】:

    • 在初始化状态下更新。我更新了代码以反映它。
    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2021-08-01
    • 2020-07-30
    • 2023-01-01
    • 2019-04-13
    • 2020-04-13
    相关资源
    最近更新 更多