Как ждать SmsQuery с номера телефона перед действием - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь вызвать действие после получения текстового сообщения, но безуспешно.Я могу запустить свое действие, когда SMS отправлено и даже доставлено, но не при получении.Я использую смс 0.1.0 https://pub.dartlang.org/packages/sms#-readme-tab-

, чтобы быть понятным

1 - я могу отправить смс на другое устройство

2 - другое устройство получает смс

3 - другое устройство затем отправляет мне смс

4 - я хотел бы вызвать действие при получении этого ответа

В настоящее время я не могу найтикак это сделать

вот текущий код

...

 SmsSender sender = new SmsSender();
 String _nirbinumber;
 SmsReceiver receiver = new SmsReceiver();
 SmsMessage _lastMessage = new SmsMessage(null, "No new messages");

...

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      home: new Scaffold(
        body: new Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            new Container(
                height: 250.0,
                child: new Stack(
                  children: <Widget>[
                    new Center(
                      child :
                       new Container(
                        child : new FloatingActionButton(
                            child : new Icon (Icons.location_on),

                            onPressed: ()
                            async {

                               SmsMessage message = new SmsMessage(_nirbinumber, '$loc1');    
                               sender.sendSms(message);
                               message.addStateListener((state) {
                               if (state == SmsMessageState.Delivered) {
                                 receiver.onSmsReceived.listen((SmsMessage msg) => _lastMessage = msg);

                                  setState(() {
                                    savegeoValue();    // function to extract GPS coordinate of the received sms and save it with "shared preference" 
                                    StreamSubscription<SmsMessage> _smsSubscription;
                                    }
                                  );
                                  showMap();   // function to launch googlemap view
                                 }
                                }
                              );
                            }
                        ),
                      ),
                    ),
                  ],
                )
            )
          ],
        )
    )
);

}

1 Ответ

0 голосов
/ 15 мая 2018

Причиной того, что вы всегда на одно сообщение "позади", является эта строка receiver.onSmsReceived.listen((SmsMessage msg) => _lastMessage = msg);

Эта строка просто создает слушателя. Он не ожидает прибытия сообщения, поэтому вы немедленно переходите в setState (предыдущее сообщение все еще находится в _lastMessage). На самом деле бессмысленно продолжать создавать слушателя - он вам просто нужен.

Я бы структурировал его по-другому, чтобы у вас всегда был один и тот же слушатель, который сообщает вам обо всех входящих сообщениях, и вы ищете ответы на основе, например, номера телефона или некоторых ожидаемых символов в теле.

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => new _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _nirbinumber = '12345';
  // _lastMessage is probably redundant, as you can use msg (below)
  SmsMessage _lastMessage = new SmsMessage('', '');

  @override
  void initState() {
    super.initState();
    // listen to the stream of *all* message arriving
    new SmsReceiver().onSmsReceived.listen((SmsMessage msg) {
      // filter out the replies by number
      if (msg.address == _nirbinumber) {
        // fantastique - it's one of the ones we want
        setState(() {
          _lastMessage = msg;
        });
        saveGeoValue(msg); // this cannot use the value in _lastMessage as it will not have been set yet
        showMap(msg);
      }
    });
  }

  void _send() {
    // fire (and forget)
    new SmsSender().sendSms(new SmsMessage(_nirbinumber, 'test message'));
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('SMS demo'),
      ),
      body: new Center(
        child: new Text(_lastMessage.body),
      ),
      floatingActionButton: new FloatingActionButton(
        onPressed: _send,
        tooltip: 'Send SMS',
        child: new Icon(Icons.sms),
      ),
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...