Flutter: функция возвращает ноль - PullRequest
0 голосов
/ 22 февраля 2020

Не уверен, почему я получаю ноль в полезной нагрузке. Я хочу использовать полезную нагрузку, чтобы определить, зарегистрировано ли мое устройство или нет. Если я зарегистрируюсь, я подпишусь на topi c. Если нет, я сделаю что-нибудь еще. Но я получаю нулевое значение для полезной нагрузки.

Часть 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 голосов
/ 22 февраля 2020

Вы получаете ноль, потому что 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;
}
...