如何解决Flutter中Pinput组件的OTP自动填充失效问题?
修复Flutter Pinput包OTP自动填充失效问题
下面是针对你遇到的OTP自动填充失效问题的具体修复步骤:
初始化SmsRetriever监听
页面初始化时必须启动短信监听,否则SmsRetrieverApi无法捕获短信。在页面的initState中添加以下代码:@override void initState() { super.initState(); _startSmsListener(); } void _startSmsListener() async { await SmsAutoFill().listenForCode; }同时确保
pubspec.yaml中引入了依赖包:sms_autofill: ^2.3.0 # 使用最新稳定版本配置AndroidManifest广播接收器
在android/app/src/main/AndroidManifest.xml的<application>标签内添加广播接收器配置:<receiver android:name="com.github.flutterme.smsautofill.SmsAutoFillBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="com.google.android.gms.auth.api.phone.SMS_RETRIEVED" /> </intent-filter> </receiver>另外必须验证签名哈希:用以下命令生成调试/正式签名的哈希值,添加到Firebase控制台的项目设置中:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | xxd -p | tr -d "[:space:]" | echo -n 你的应用包名 `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11确保短信格式符合要求
Firebase发送的OTP短信必须包含签名哈希尾缀,格式示例:你的验证码是:123456。
FA+9qCX9VSu
最后一行的字符串是你的应用签名哈希对应的标识,Firebase在配置正确签名哈希后会自动添加该内容,缺失则无法被SmsRetriever识别。修正代码语法与资源释放
你的Pinput代码中controller: _pinPutController末尾缺少逗号,先补上避免语法错误:Pinput( focusNode: focusNode, androidSmsAutofillMethod: AndroidSmsAutofillMethod.smsRetrieverApi, length: 6, defaultPinTheme: defaultPinTheme, listenForMultipleSmsOnAndroid: true, controller: _pinPutController, // 补上缺失的逗号 onChanged: ((value) => print(value)), onCompleted: (pin) async { // 原有验证逻辑 }, ),同时在页面销毁时释放资源:
@override void dispose() { focusNode.dispose(); _pinPutController.dispose(); SmsAutoFill().unregisterListener(); super.dispose(); }检查版本兼容性
确保pinput与sms_autofill使用最新稳定版,避免版本冲突导致的功能异常,建议pinput使用^3.0.0以上版本。
内容的提问来源于stack exchange,提问作者F sam
相关产品推荐
相关产品推荐

