Flutter Ui仅针对颤振中的最后一个流进行更新

Flutter Ui仅针对颤振中的最后一个流进行更新,flutter,listview,sms,stream-builder,Flutter,Listview,Sms,Stream Builder,我正在制作一个sms_应用程序,当我按下按钮发送sms时,它可以从对象列表中获取数据。对象有一个返回流的方法。我使用ListViewbuilder迭代数据,并通过StreamViewBuilder收听流。所有对象流都在执行发送消息的功能。如果我按第一个发送按钮,然后等待,再按第二个按钮,然后等待,它会相应地更新UI。 但是 正在为最后一个流更新UI。如果我不等待就一个接一个地按下按钮。我做错了什么>。 这是你的电话号码 导入“包装:颤振/材料.省道”; 导入“包:sms_维护/sms.dart”

我正在制作一个sms_应用程序,当我按下按钮发送sms时,它可以从对象列表中获取数据。对象有一个返回流的方法。我使用ListViewbuilder迭代数据,并通过StreamViewBuilder收听流。所有对象流都在执行发送消息的功能。如果我按第一个发送按钮,然后等待,再按第二个按钮,然后等待,它会相应地更新UI。
但是 正在为最后一个流更新UI。如果我不等待就一个接一个地按下按钮。我做错了什么>。 这是你的电话号码

导入“包装:颤振/材料.省道”;
导入“包:sms_维护/sms.dart”;
类SendSmsScreen扩展了无状态小部件{
最终SmsSender发送器=SmsSender();
最终SmsMessage message=SmsMessage('03009640742','u body');
最终列表smsList=[
SmsMessage('03009750742','Random'),
短信('03008750742','Kaleem'),
SmsMessage('03056750742','Shahryar'),
短信('03127750742','Shahryar Zong')
];
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(),
正文:ListView.builder(
itemCount:smsList.length,
itemBuilder:(上下文,索引){
返回SingleChildScrollView(
子:列(
儿童:[
图标按钮(
图标:图标(Icons.send),
onPressed:()异步{
等待发送者发送短信(smsList[index]);
},
),
StreamBuilder(
关键字:GlobalKey(debugLabel:'String$index'),
//初始数据:SMSMessagentate。无,
生成器:(上下文,快照){
if(snapshot.data==smsmsmessagestate.Sent){
返回文本(“已发送消息”);
}
如果(snapshot.data==smsmsmessagestate.Delivered){
返回文本(“消息已传递”);
}
if(snapshot.data==smsmsmessagestate.Sending){
返回文本(“发送”);
}
如果(snapshot.data==smsmsmessagestate.Fail)
返回文本(“发送失败”);
返回文本('Error');
},
流:smsList[index]。onStateChanged,
),
],
),
);
},
));
}
}

我假设如果按下按钮太快,UI无法正确更新

您可以禁用按钮(下面的示例),直到消息传递为止。您只需将按钮设置为StreamBuilder的子级

onPressed: snapshot.data == SmsMessageState.Sending ? null : () async {
                  await sender.sendSms(smsList[index]);
                }

这是因为它们都在执行相同的方法。当您快速连续执行多个执行时,最后一个执行将停止上一个执行。您必须找到一种方法在执行时对它们进行排队,并且只有在上一个按钮完成时才执行下一个。

当我按下视频中的按钮列表时,ui没有更新[您能指导我如何执行此操作吗?我是颤振方面的新手
onPressed: snapshot.data == SmsMessageState.Sending ? null : () async {
                  await sender.sendSms(smsList[index]);
                }