【问题标题】:Flutter: Function returns nullFlutter:函数返回null
【发布时间】:2026-02-17 14:00:01
【问题描述】:

不知道为什么我在有效载荷中得到空值。我想使用有效负载来确定我的设备是否已注册。如果注册我会订阅主题。如果没有,我会做其他事情。但我的有效载荷为空。

第 1 部分:

client.subscribe(registerTopic, MqttQos.atMostOnce);
onSub().then((payload) {
  //if(payload == '1')
  print('Payload: $payload');
  client.subscribe(subTopic, MqttQos.atMostOnce);
});

然后是第 2 部分:

Future<String> onSub() async {
  client.updates.listen((List<MqttReceivedMessage<MqttMessage>> c) {
    final MqttPublishMessage recMess = c[0].payload;
    receivedMessage =
        MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
    print(
        '::Change notification:: topic -> <${c[0].topic}>, payload ->  <$receivedMessage> ');
    payload = receivedMessage;
  });

  return payload;
}

我的输出:

Performing hot restart...
Syncing files to device AOSP on IA Emulator...
Restarted application in 2,501ms.
I/flutter (12404): ::Data connection is available.
I/flutter (12404): ::Mosquitto client connecting....
I/flutter (12404): ::Mosquitto client connected
I/flutter (12404): Payload: null
I/flutter (12404): ::Subscription confirmed -> topic -> registerTopic/registered
I/flutter (12404): ::Subscription confirmed -> topic -> subTopic/control_instruction
I/flutter (12404): ::Change notification:: topic -> <reisterTopic/registered>, payload ->  <1> 
I/flutter (12404): ::Change notification:: topic -> <subTopic/control_instruction>, payload ->  <00010000011000000000> 

【问题讨论】:

    标签: flutter dart async-await


    【解决方案1】:

    你得到空值,因为在收到来自client.updates 的第一条消息之前已经调用了then 你不应该使用Future。如果你想在第一条消息后连接,你应该使用Stream&lt;String&gt; 而不是Future&lt;String&gt;

    第 1 部分:

    client.subscribe(registerTopic, MqttQos.atMostOnce);
    client.updates
      .map<String>(_mapToString)
      .listen((String payload) {
        if (payload == '1') {
          client.subscribe(subTopic, MqttQos.atMostOnce);
        }
      });
    

    第 2 部分:

    String _mapToString(List<MqttReceivedMessage<MqttMessage>> c) {
      final MqttPublishMessage recMess = c[0].payload;
      receivedMessage = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
      print(
        '::Change notification:: topic -> <${c[0].topic}>, payload ->  <$receivedMessage> ');
      return receivedMessage;
    }
    

    【讨论】:

    • 成功了,谢谢。你能给我推荐一些好的教程,这样我就可以更好地理解 Stream。我对此真的很陌生。所以我很难理解一切。您的解决方案有效。但我不太确定我是否理解它的工作原理。
    • 如果你想了解它是如何工作的,你应该学习反应式编程。首先你应该知道Streams from Dart Docs。比Intro to Streams 和下一步"Manipulating data on the fly"