Flutter sms_autofill 并不总是自动读取 OTP

Posted

技术标签:

【中文标题】Flutter sms_autofill 并不总是自动读取 OTP【英文标题】:Flutter sms_autofill doesn't always read the OTP automatically 【发布时间】:2020-08-21 06:46:37 【问题描述】:
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,但并非总是如此,比如当我进行一些更改并进行热重载时,甚至在再次运行颤振运行后有时它不会读取代码我是否遗漏了什么?

【问题讨论】:

我能得到你如何使用 http 实现 sms_autofill 的代码吗? @Niroop,代码附在说明中。你还需要什么吗? 我的错!我最后只是犯了一些错误 能否请您告诉我们您的错误,因为我也遇到了这个问题 【参考方案1】:

如果您在 android 上进行测试,请确保您已在消息末尾添加哈希或签名代码以识别您的应用,如 plugin's doc 中所述。 hash 应与您应用的密钥库签名相对应。

【讨论】:

【参考方案2】:

尝试用这个更新你的代码块

PinFieldAutoFill(
  keyboardType: TextInputType.number,
  cursor: Cursor(color: peach, enabled: true, width: 1),
  autoFocus: true,
  controller: _pinController,
  codeLength: 6,
  currentCode: "",
  decoration: BoxLooseDecoration(
    textStyle: TextStyle(color: Colors.black),
    radius: Radius.circular(1),
    strokeColorBuilder: FixedColorBuilder(Colors.black)),
    onCodeChanged: (pin) 
     if (pin.length == 6) 
     signInWithPhoneNumber(pin);
     
  ,
),

【讨论】:

以上是关于Flutter sms_autofill 并不总是自动读取 OTP的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 总是重启而不是热重载

Flutter web 在带有深色主题的 Android 浏览器中的颜色错误

Provider.of 总是返回 null Flutter

Flutter并不像你想象中的那么完美

flutter 并不完美的登录完美验证功能

Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应