首页 > 解决方案 > Flutter sms_autofill 并不总是自动读取 OTP

问题描述

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'),
                          )
                        ],
                      )
                    ],
                  );
          }
        },
      ),
    );
  }
}

嗨,我正在使用sms_autofill 1.2.3自动填充 OTP。我的颤振应用程序能够自动读取 OTP,但并非总是如此,比如当我进行一些更改并进行热重载时,甚至在再次运行颤振运行后,有时它不会读取代码我是否遗漏了什么?我正在使用 sms_autofill 1.2.3 自动填充 OTP。我的颤振应用程序能够自动读取 OTP,但并非总是如此,比如当我进行一些更改并进行热重载时,甚至在再次运行颤振运行后,有时它不会读取代码我是否遗漏了什么?

标签: flutterdartautofill

解决方案


如果您在 Android 上进行测试,请确保您已在消息末尾添加哈希或签名代码,以识别插件文档中提到的您的应用程序。哈希应该对应于您的应用程序的密钥库签名。


推荐阅读