【发布时间】:2023-03-18 00:32:01
【问题描述】:
你好
我正在尝试使用 Flutter 制作我的第一个社交应用,但遇到了困难。 我想从我的 api 获取我的消息(在两个用户之间的对话中)。 当我使用 Future 和 Future Builder 时没有问题,但我希望在发送新消息时更新消息列表!
我发现我们可以使用流实现它,但是每次我尝试在流中转换我的 Future 时,它仍然有效,但就像它是一个 Future(它永远不会更新新消息)。
这里是我的代码的简化部分:
class Test extends StatelessWidget {
final Conv conv;
final User otherUser;
const Test({Key key, this.conv, this.otherUser}) : super(key: key);
Stream<List<Message>> messageFlow(String convId) {
return Stream.fromFuture(getMessages(convId));
}
Future<List<Message>> getMessages(String convId) async {
var data = await http
.post(MyApiUrl, headers: <String, String>{}, body: <String, String>{
"someParam": "param",
"id": convId,
});
var jsonData = json.decode(data.body);
List<Message> messages = [];
for (var m in jsonData) {
Message message = Message.fromJson(m);
messages.add(message);
}
return messages;
}
@override
Widget build(BuildContext context) {
return StreamBuilder(
stream: messageFlow(conv.id),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.data == null) {
return Container(
child: Center(
child: Text('Loading'),
),
);
}
return ListView.builder(
reverse: true,
controller: _messagesListController,
itemCount: snapshot.data.length,
itemBuilder: (BuildContext context, int index) {
Message message = snapshot.data[index];
var isMe = message.owner == otherUser.id ? false : true;
return _buildMessage(message, isMe);
});
});
}
}
如果你能帮助我,那就太好了!
【问题讨论】:
-
将
Future转换为Stream与您发现的仅使用Future基本相同。您需要创建自己的Stream,它会定期执行您现有的Future。查看this 的“从头开始创建流”部分。
标签: http flutter stream future stream-builder