Come posso restituire la variabile dal metodo di verifica del telefono FirebaseAuth in flutter?

2019-05-16 firebase flutter firebase-authentication flutter-dependencies sms-verification

Sto usando la verifica del telefono FirebaseAuth, il mio problema è che sto usando il modello di blocco, quindi voglio che il metodo di verifica del telefono FirebaseAuth restituisca alcune variabili al Blocco per indicare se l'utente esiste già o meno per navigare alla schermata di verifica del telefono o meno .

Ecco il mio metodo di verifica del telefono, nota che questa funzione è in un'altra classe non nel Blocco:

 static sendPhoneVerificationMessage(String phone) async {
    AuthCredential credential;
    final PhoneVerificationCompleted verificationCompleted = (AuthCredential user){
      print('Inside _sendCodeToPhoneNumber: signInWithPhoneNumber auto succeeded: '+user.toString());
    };

    final PhoneVerificationFailed verificationFailed = (AuthException authException){
      print('Phone number verification failed. Code: ${authException.code}. Message: ${authException.message}');
    };

    final PhoneCodeSent codeSent =
        (String verificationId, [int forceResendingToken]) async {
          verificationCode = verificationId;
      print("code sent to " + phone);
    };

    final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout =
        (String verificationId) {
      verificationCode = verificationId;
      print("time out");
    };

      await FirebaseAuth.instance.verifyPhoneNumber(
          phoneNumber: phone,
          timeout: const Duration(seconds: 120),
          verificationCompleted: verificationCompleted,
          verificationFailed: verificationFailed,
          codeSent: codeSent,
          codeAutoRetrievalTimeout: codeAutoRetrievalTimeout);

  }

Questa è la funzione all'interno del blocco che chiama la funzione precedente

  static sendPhoneVerificationMessage(String phone) async {
    String formattedPhone = "+2" + phone;
    await AuthAPI.sendPhoneVerificationMessage(formattedPhone);
  }

Quello che voglio è eseguire alcune azioni in base al ritorno dalla funzione sendPhoneVerificationMessage

Answers

Ho usato la verifica del telefono FirebaseAuth con il modello di blocco come stai provando.

Nel mio caso, prendo il controllo con uno Stream. Ho un Enum che contiene tutti i possibili stati del processo di verifica e, per ogni stato, chiamo _stream.sink.add(MyEnum.CURRENT_STATE) . (È possibile eseguire questo controllo nei callback.)

E infine, a mio avviso, gli ascoltatori cambiano l'interfaccia utente in base al passaggio passato allo stream.

[suggerimenti gratuiti]
Fai attenzione al timeout che stai passando. Se passi un timeout diverso da zero, l'app proverà a ottenere automaticamente il codice di verifica all'interno di SMS. In questo caso, verrai verificationCompleted Richiamata completata, il codice di verifica verrà automaticamente invalidato e non potrai più utilizzarlo.

Puoi fare il controllo corretto di questa situazione ottenendo l'utente all'interno del metodo di verificationCompleted oppure puoi passare zero al timeout e disabilitare questo comportamento.

Related