Flutter sms_autofill doesn't always read the OTP automatically

Viewed 2926
import 'package:flutter/material.dart';
import 'package:sms_autofill/sms_autofill.dart';
import './../../widgets/color_loader.dart';
import './../../models/login_api_response_model.dart';
import './../../services/Authentication/authentication_service.dart';
import './../../models/enum_models.dart';
import './login_error_page.dart';

class ValidateOtp extends StatefulWidget {
  final String mobileNumber;
  ValidateOtp({@required this.mobileNumber});
  @override
  _ValidateOtpState createState() => _ValidateOtpState();
}

class _ValidateOtpState extends State<ValidateOtp> {
  final SmsAutoFill _autoFill = SmsAutoFill();
  bool verifactionFailed = false;
  Future<LoginApiResponseModel> response;
  LoginApiResponseModel loginApiResponseModel;
  bool isInit = true;
  bool resendOtp = false;
  String otp;

  void fetchOtp() {
    print('setState fetchOtp');
    response = AuthenticationService.generateOtp(widget.mobileNumber)
        .then((value) => loginApiResponseModel = value);
  }

  @override
  void initState() {
    _listenOTP();
    fetchOtp();
    super.initState();
  }


  void _listenOTP() async {
    await SmsAutoFill().listenForCode;
  }

  validateOtp(String otp) {
    print('Code received $otp');
  }

  @override
  void dispose() {
    SmsAutoFill().unregisterListener();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    print('${_autoFill.getAppSignature}');
    return Scaffold(
      body: FutureBuilder(
        future: response,
        builder: (context, dataSnapShopt) {
          if (dataSnapShopt.connectionState == ConnectionState.waiting) {
            return Center(
              child: ColorLoader(),
            );
          } else if (dataSnapShopt.error != null) {
            return Center(
              child: Text('Something went wrong..'),
            );
          } else {
            return loginApiResponseModel.status == 'fail'
                ? LoginErrorPage(
                    errorMessage: 'Invalid Mobile number!',
                    errorType: ErrorType.InvalidMobileNumber,
                  )
                : Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: [
                      Container(
                        child: Padding(
                          padding: const EdgeInsets.all(10.0),
                          child: PinFieldAutoFill(
                            autofocus: true,
                            keyboardType: TextInputType.number,
                            codeLength: 6,
                            onCodeChanged: (value) {
                              if (value.length == 6) {
                                print(' onCodeChanged');
                                otp = value;
                              }
                            },
                  
                          ),
                        ),
                      ),
                      Container(
                        child: FloatingActionButton.extended(
                          onPressed: () => validateOtp(otp),
                          label: Text('Confirm'),
                        ),
                      ),
                      Row(
                        mainAxisAlignment: MainAxisAlignment.center,
                        children: [
                          Text('Didn\'t receive OTP? '),
                          FlatButton(
                            onPressed: () {
                              setState(() {
                                resendOtp = !resendOtp;
                              });
                              fetchOtp();
                            },
                            child: Text('RESEND'),
                          )
                        ],
                      )
                    ],
                  );
          }
        },
      ),
    );
  }
}

Hi, I am using sms_autofill 1.2.3 to autofill the OTP. my flutter application is able to read the OTP automatically but not always, Like when I make some change and do hot reload or even after running flutter run again sometimes it doesn't read the code am I missing something? I am using sms_autofill 1.2.3 to autofill the OTP. my flutter application is able to read the OTP automatically but not always, Like when I make some change and do hot reload or even after running flutter run again sometimes it doesn't read the code am I missing something?

1 Answers

If you're testing this on Android, make sure that you've added the hash or signature code at the end of your message to identify your app as mentioned in the plugin's doc. The hash should correspond to the your app's keystore signature.

Related