首页 > 解决方案 > Ui 仅针对颤振中的最后一个流进行更新

问题描述

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

import 'package:flutter/material.dart';
import 'package:sms_maintained/sms.dart';

class SendSmsScreen extends StatelessWidget {
  final SmsSender sender = SmsSender();
  final SmsMessage message = SmsMessage('03009640742', '_body');
  final List<SmsMessage> smsList = [
    SmsMessage('03009750742', 'Random'),
    SmsMessage('03008750742', 'Kaleem'),
    SmsMessage('03056750742', 'Shahryar'),
    SmsMessage('03127750742', 'Shahryar Zong')
  ];
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(),
        body: ListView.builder(
          itemCount: smsList.length,
          itemBuilder: (context, index) {
            return SingleChildScrollView(
              child: Column(
                children: [
                  IconButton(
                    icon: Icon(Icons.send),
                    onPressed: () async {
                      await sender.sendSms(smsList[index]);
                    },
                  ),
                  StreamBuilder<SmsMessageState>(
                    key: GlobalKey(debugLabel: 'String $index'),
                    // initialData: SmsMessageState.None,
                    builder: (context, snapshot) {
                      if (snapshot.data == SmsMessageState.Sent) {
                        return Text('Message Sent');
                      }
                      if (snapshot.data == SmsMessageState.Delivered) {
                        return Text('Message Delivered');
                      }
                      if (snapshot.data == SmsMessageState.Sending) {
                        return Text('Sending');
                      }
                      if (snapshot.data == SmsMessageState.Fail)
                        return Text('Sending Failed');
                      return Text('Error');
                    },
                    stream: smsList[index].onStateChanged,
                  ),
                ],
              ),
            );
          },
        ));
  }
}

标签: flutterlistviewsmsstream-builder

解决方案


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


推荐阅读