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。
我的 flutter 应用程序能够自动读取 OTP,但并非总是如此,就像当我进行一些更改并进行热重载时,或者甚至在再次运行 flutter run 之后,有时它不会读取代码,我是否遗漏了某些内容?
我正在使用 sms_autofill 1.2.3 自动填充 OTP。
我的 flutter 应用程序能够自动读取 OTP,但并非总是如此,就像当我进行一些更改并进行热重载时,或者甚至在再次运行 flutter run 之后,有时它不会读取代码,我是否遗漏了什么?
您是否在 Android 中启用了自动读取 OTP。要在 Android 中启用自动读取 OTP,您需要在 AndroidManifest.xml 文件中请求 RECEIVE_SMS 权限。
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
您可以使用最新版本的 sms_autofill 软件包。