【问题标题】:Ui is updating only for last stream in flutterUi 仅针对颤振中的最后一个流进行更新
【发布时间】:2020-12-25 05:13:11
【问题描述】:

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

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,
                  ),
                ],
              ),
            );
          },
        ));
  }
}

【问题讨论】:

    标签: flutter listview sms stream-builder


    【解决方案1】:

    我假设如果按下按钮太快,用户界面不会正确更新。

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

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您能指导我如何执行此操作。我是 Flutter 的新手
    猜你喜欢
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2019-09-03
    • 2021-08-21
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多