- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的应用程序有一封电子邮件和一个电话注册,使用正确的信息登录后,我会直接将电子邮件转移到主页,但是,当我使用电话身份验证登录时,它将带我回到身份验证页面,并且仅允许如果我热重启,我会进入主页,身份验证完成后,我什至试图直接导航到主页,但是直到热重启后,我似乎才意识到我已登录,任何想法我都可以处理?
验证码:
String phoneNo;
String smsCode;
String verificationId;
String uid;
Future<void> verifyPhone() async {
final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verId) {
this.verificationId = verId;
};
final PhoneCodeSent smsCodeSent = (String verId, [int forceCodeResend]) {
this.verificationId = verId;
smsCodeDialog(context).then((value) {
print('Signed in');
});
};
final PhoneVerificationCompleted verifiedSuccess = (FirebaseUser user) {
print('verified');
};
final PhoneVerificationFailed veriFailed = (AuthException exception) {
print('${exception.message}');
};
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: this.phoneNo,
codeAutoRetrievalTimeout: autoRetrieve,
codeSent: smsCodeSent,
timeout: const Duration(seconds: 5),
verificationCompleted: verifiedSuccess,
verificationFailed: veriFailed);
}
Future<bool> smsCodeDialog(BuildContext context) {
return showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return new AlertDialog(
title: Text('Enter sms Code'),
content: TextField(
onChanged: (value) {
this.smsCode = value;
},
),
contentPadding: EdgeInsets.all(10.0),
actions: <Widget>[
new FlatButton(
child: Text('Done'),
onPressed: () {
FirebaseAuth.instance.currentUser().then((user) {
if (user != null) {
setState(() {
this.uid = user.uid;
_submitForm(widget.model.authenticate, 2);
Navigator.of(context).pushReplacementNamed('/');
});
} else {
Navigator.of(context).pop();
signIn();
}
});
},
)
],
);
});
}
signIn() async {
_submitForm(widget.model.authenticate, 2);
}}
void _submitForm(Function authenticate, int option) async {if(option == 2) {
Map<String, dynamic> successInformation;
successInformation = await authenticate(
null, phoneNo, null, tokenValue, uid, verificationId, smsCode);
if (successInformation['success']) {
Navigator.pushReplacementNamed(context, '/');
}} else{
Map<String, dynamic> successInformation;
successInformation = await authenticate(_formData['Email'], null,
_formData['Password'], tokenValue, null, null, null, _authMode);
if (successInformation['success']) {
print('success');
Navigator.pushReplacementNamed(context, '/');
} }
Future<Map<String, dynamic>> authenticate(
String email,
String phone,
String password,
String token,
String id,
String verificationId,
String smsCode,
[AuthMode mode = AuthMode.Login]) async {
_isLoading = true;
notifyListeners();
String uid;
final Map<String, dynamic> authData = {
'email': email,
'password': password,
'returnSecureToken': true,
};
if (email != null) {
try {
FirebaseUser user = await FirebaseAuth.instance
.signInWithEmailAndPassword(email: email, password: password);
uid = user.uid;
} catch (error) {
_isLoading = false;
notifyListeners();
}
} else {
FirebaseUser user = await FirebaseAuth.instance.signInWithPhoneNumber(
verificationId: verificationId, smsCode: smsCode);
print(user);
uid = user.uid;
}
_authenticatedUser =
User(id: uid, phone: phone, email: email, token: token);
setAuthTimeout(int.parse(1000.toString()));
_userSubject.add(true);
email == null
? addTokenPhone(token, _authenticatedUser.phone, uid)
: addToken(token, _authenticatedUser.email, uid);
final DateTime now = DateTime.now();
final DateTime expiryTime =
now.add(Duration(seconds: int.parse(10000.toString())));
SharedPreferences prefs = await SharedPreferences.getInstance();
prefs.setString('token', uid);
prefs.setString('userEmail', email);
prefs.setString('phone', phone);
prefs.setString('userId', uid);
prefs.setString('expiryTime', expiryTime.toIso8601String());
_isLoading = false;
notifyListeners();
return {
'success': true,
'message': 'message',
};
}
void autoAuthenticate() async {
final SharedPreferences prefs = await SharedPreferences.getInstance();
final String token = prefs.getString('token');
final String expiryTimeString = prefs.getString('expiryTime');
if (token != null) {
final DateTime now = DateTime.now();
final parsedExpiryTime = DateTime.parse(expiryTimeString);
if (!verified) {
if (parsedExpiryTime.isBefore(now)) {
_authenticatedUser = null;
notifyListeners();
return;
}
}
final String userEmail = prefs.getString('userEmail');
final String phone = prefs.getString('phone');
final String userId = prefs.getString('userId');
final int tokenLifespan = parsedExpiryTime.difference(now).inSeconds;
_authenticatedUser =
User(id: userId, email: userEmail, phone: phone, token: token);
print(_authenticatedUser);
_userSubject.add(true);
setAuthTimeout(tokenLifespan);
notifyListeners();
}
}
bool _isAuthenticated = false;
@override
void initState() {
_model.autoAuthenticate();
_model.userSubject.listen(
(bool isAuthenticated) {
setState(
() {
_isAuthenticated = isAuthenticated;
},
);
},
);
super.initState();
}
'/': (BuildContext context) =>
!_isAuthenticated ? AuthPage() : HomePage(),
最佳答案
我只是确保在每个需要id的方法中都调用它:
FirebaseUser user = await FirebaseAuth.instance.currentUser();
关于firebase - Flutter Firebase电话登录需要热重启才能通过身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52583563/
我想要类似于以下伪代码的东西: while input is not None and timer = 5: print "took too long" else: print inp
如何将 MainEngine Observable 转换为 Cold?来自这个例子: public IObservable MainEngine { get
自从手表被发明以来,表盘的方圆之争就始终没有停下来过,在漫长的岁月中,无论是方形还是圆形表盘,人们都为其寻找到足够多的设计元素,让其肆意成长,这种生机与活力后来也延续到了智能手表上,在2014年,这
我正在学习 CUDA,试图解决一些标准问题。例如,我正在使用以下代码求解二维扩散方程。但我的结果与标准结果不同,我无法弄清楚。 //kernel definition __global__ void
我的 Web 应用程序使用 native dll 来实现其部分功能(其位置在 PATH 中提供)。一切正常,直到我对 WAR 进行更改并且 JBoss 热部署此 WAR。此时dll已经找不到了,需要手
我看到这个问题here 。这是关于实现每个发出的项目的延迟。这是根据accepted answer如何实现的: Observable.zip(Observable.range(1, 5) .g
我最近一直在进行冷迁移...这意味着我无法在进行迁移时从应用程序级别读取/写入数据库(维护页面)。 这样就不会因为更改结构而发生错误,而且如果负载很大,我也不希望 mysql 在迁移过程中崩溃。 我的
我是一名优秀的程序员,十分优秀!