flutter - Flutter web socket,事件之间的异步方法
问题描述
我有一个 websocket,服务器可以在一段时间内发送许多事件(消息)。对于每个事件,我必须调用一个异步函数,该函数在显示第二个事件之前说出句子(flutter-tts)。这样做的正确方法是什么?使用数组流?使用 List.builder ?
我需要在 Flutter 中准确地复制这篇文章(在 angular/rxjs 中):
谢谢你的帮助 !
添加了一些代码以便更好地理解:
...
socket.on('messageToClient', (data) {
print("socket $data");
MessageModel message = MessageModel.fromJson(data);
setState(() {
_messages.add(message);
});
});
ListView.builder(
scrollDirection: Axis.vertical,
shrinkWrap: true,
itemCount: _messages.length,
itemBuilder: (BuildContext context, int indexMessage) {
print("index");
// Seems it's not waiting here
return FutureBuilder(
future: _speak(_messages[indexMessage].message),
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return CircularProgressIndicator();
default:
if (snapshot.hasError)
return Text('Error: ${snapshot.error}');
else {
return TextMessage(
message: _messages[indexMessage].message,
author: _messages[indexMessage].author,
hint: _messages[indexMessage].hint,
options: _messages[indexMessage].options,
giveVoice:
_messages[indexMessage].giveVoice,
);
}
}
});
}),
...
解决方案
你到底是什么意思:
对于每个事件,我必须调用一个异步函数_在显示第二个事件之前说出句子
如果你的意思是使用 Flutter显示“句子”,你可以试试这个:
理想情况下,您将能够访问listen
websocket。这样做会给你一种Stream
(我认为)。然后使用StreamBuilder
Flutter 中的小部件更新来自 websocket 的每个事件的 UI。也许ListView.builder
在StreamBuilder
.
推荐阅读
- sparql - 在 SPARQL 中按对象属性查询
- mysql - 由于数据截断错误,无法使用 Nifi PutDatabaseRecord 在 MySQL 中插入“BIT”值
- laravel - 碳今天或以前的日期
- firebase - 阻止用户写入 firebase 表中的特定字段
- asp.net-core - 在我的 NetCore 应用程序中添加 AzureAD 用户时出错?
- ios - 如何在objc中循环字节数组
- reactjs - 使用 Redux 和 useDispatch 将基于类的组件重构为功能组件不起作用
- c - 将对各个数据缓冲区的引用作为成员结构或在函数内定义本地数组?
- python - 如何在 Dash 中编写应用程序布局,使两个图表并排?
- javascript - 比较两个数组的值,如果一个值被删除而不是添加,则只返回差值