Flutter:函数返回null

时间:2020-02-22 09:48:11

标签: flutter dart async-await

不确定为什么我的有效载荷为空。我想使用有效负载来确定我的设备是否已注册。如果注册,我将订阅主题。如果没有,我会做别的事情。但是我的有效负载为空。

第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> 

1 个答案:

答案 0 :(得分:0)

您将得到null,因为在收到来自then的第一条消息之前已调用client.updates,因此您不应使用Future。如果要在出现第一条消息后进行连接,则应使用Stream<String>而不是Future<String>

第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;
}