Flatter Firebase Auth:发生网络错误(例如超时、连接中断或无法访问主机)
我正在尝试使用Flatter Firebase Auth:发生网络错误(例如超时、连接中断或无法访问主机),firebase,flutter,dart,firebase-authentication,Firebase,Flutter,Dart,Firebase Authentication,我正在尝试使用firebase\u auth在flifter上集成身份验证 但是,每当我调用verifyPhoneNumber(“+256xxxxxxxxx”)时,我都会收到错误消息出现网络错误(例如超时、连接中断或无法访问主机)。,即来自PhoneVerificationFailed回调的错误。由于这个原因,一个用户无法收到短信 我试过了 将网络权限添加到我的文件中,如下所示(我的internet连接正常,因为我可以通过仿真器进行谷歌搜索) 检查API密钥的有效性 我完全搞不懂为什么弗利
firebase\u auth
在flifter上集成身份验证
但是,每当我调用verifyPhoneNumber(“+256xxxxxxxxx”)
时,我都会收到错误消息出现网络错误(例如超时、连接中断或无法访问主机)。
,即来自PhoneVerificationFailed
回调的错误。由于这个原因,一个用户无法收到短信
我试过了
import 'package:firebase_auth/firebase_auth.dart';
FirebaseAuth auth = FirebaseAuth.instance;
var message;
// fire this when Phone verification is completed
final PhoneVerificationCompleted verificationCompleted =
(AuthCredential phoneAuthCredential) {
auth.signInWithCredential(phoneAuthCredential);
message = 'Received phone auth credential: $phoneAuthCredential';
print(message);
};
// fire this when Phone verification fails
final PhoneVerificationFailed verificationFailed =
(AuthException authException) {
message =
'Phone verification failed. Code: ${authException.code}. Message: ${authException.message}';
print(message);
};
// fire this when SMS code is sent is sent.
final PhoneCodeSent codeSent =
(String verificationId, [int forceResendingToken]) async {
verificationId = verificationId;
print('Sent verification code');
};
// fire this when smsCode expires
final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout =
(String verificationId) {
verificationId = verificationId;
print('Auto retrival time-out');
};
// verify phone number
verifyPhoneNumber(String phoneNumber) {
auth.verifyPhoneNumber(
phoneNumber: phoneNumber,
timeout: const Duration(seconds: 30),
verificationCompleted: verificationCompleted,
verificationFailed: verificationFailed,
codeSent: codeSent,
codeAutoRetrievalTimeout: codeAutoRetrievalTimeout);
print('Verification Initiated');
}
// sign in with phone.
signInWithPhoneNumber(String smsCode, String verificationId) async {
final AuthCredential credential = PhoneAuthProvider.getCredential(
verificationId: verificationId,
smsCode: smsCode,
);
final FirebaseUser user = (await auth.signInWithCredential(credential)).user;
final FirebaseUser currentUser = await auth.currentUser();
assert(user.uid == currentUser.uid);
if (user != null) {
message = 'Successfully signed in, uid: ' + user.uid;
} else {
message = 'Sign in failed';
}
}
import'包:badam/varify.dart';
进口“包装:颤振/材料.省道”;
导入“包:firebase_auth/firebase_auth.dart”;
导入“dart:async”;
导入“HomePage.dart”;
void main()=>runApp(MyApp());
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
debugShowCheckedModeBanner:false,
标题:“FireBase演示”,
主题:主题数据(
主样本:颜色。蓝色,
),
主页:新登录页(),
路线:{
“/loginpage”:(BuildContext上下文)=>Dash(),
“/landpage”:(BuildContext上下文)=>LoginPage(),
}
);
}
}
类LoginPage扩展StatefulWidget{
@凌驾
_LoginPagentate createState()=>_LoginPagentate();
}
类_loginpagentate扩展状态{
字符串phoneNo、smsId、verificationId;
Future verifyPhone()异步{
最终PhoneCodeAutoRetrievalTimeout autoRetrieve=(字符串verId){
this.verificationId=verId;
};
final PhoneCodeSent smsCodeSent=(字符串verId,[int forceCodeResend]){
this.verificationId=verId;
smsCodeDialoge(上下文)。然后((值){
打印(“登录”);
});
};
最终电话验证完成验证成功=(AuthCredential auth){
打印(“已验证”);
};
最终电话验证失败verifyFailed=(验证异常e){
打印(“${e.message}”);
};
等待FirebaseAuth.instance.verifyPhoneNumber(
电话号码:phoneNo,
超时:常量持续时间(秒数:5),
验证完成:验证成功,
验证失败:验证失败,
代码发送:smsCodeSent,
codeAutoRetrievalTimeout:autoRetrieve,
);
}
未来smsCodeDialoge(构建上下文){
返回showDialog(上下文:上下文,
禁止:错误,
生成器:(BuildContext上下文){
返回新警报对话框(
标题:文本(“输入OTP”),
内容:TextField(
一旦更改:(值){
this.smsId=值;
},
),
contentPadding:EdgeInsets.all(10.0),
行动:[
新扁平按钮(
已按下:(){
FirebaseAuth.instance.currentUser().then((用户){
如果(用户!=null){
Navigator.of(context.pop();
导航器。推(
上下文
MaterialPage路线(生成器:(上下文)=>Dash()),
);
}
否则{
Navigator.of(context.pop();
签名(smsId);
}
}
);
},
子项:文本('Done',style:TextStyle(颜色:Colors.blue),)
],
);
},
);
}
未来登录(字符串smsCode)异步{
最终AuthCredential凭据=PhoneAuthProvider.getCredential(
验证ID:verificationId,
smsCode:smsCode,
);
等待FirebaseAuth.instance.signInWithCredential(凭证)
.然后((用户){
Navigator.of(context.pushReplacementNamed('/loginpage');
}).catchError((e){
印刷品(e);
});
}
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
标题:文本(“登录”)
),
正文:专栏(
mainAxisAlignment:mainAxisAlignment.center,
儿童:[
Text('Phone Auth',style:TextStyle(字体大小:20,颜色:Colors.blue),),
填充物(
填充:常数边集全部(16.0),
孩子:TextField(
装饰:输入装饰(
hintText:'输入您的电话号码',
),
一旦更改:(值){
this.phoneNo=值;
},
),
),
尺寸箱(高度:10.0),
升起的按钮(
按下:verifyPhone,
子项:文本('Verify',样式:TextStyle(颜色:Colors.white),),
标高:7.0,
颜色:颜色,蓝色,
)
],
),
);
}
}
这对我来说很有效,我希望能帮助你在我的情况下,是我的VPN造成了这个问题。禁用VPN并再次测试解决了此错误。我希望这能有所帮助。在我的例子中,我解决了在Xcode的Runner.xcworkspace上允许传出连接的问题
谢谢,在Flatter for Desktop(macos)版本中,默认情况下未选中传出连接。
import 'package:badam/varify.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'dart:async';
import 'HomePage.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
title: 'FireBase Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: new LoginPage(),
routes: <String, WidgetBuilder>{
'/loginpage' : (BuildContext context) => Dash(),
'/landpage' : (BuildContext context) => LoginPage(),
}
);
}
}
class LoginPage extends StatefulWidget {
@override
_LoginPageState createState() => _LoginPageState();
}
class _LoginPageState extends State<LoginPage> {
String phoneNo, smsId, verificationId;
Future<void> verifyPhone() async{
final PhoneCodeAutoRetrievalTimeout autoRetrieve = (String verId){
this.verificationId = verId;
};
final PhoneCodeSent smsCodeSent = (String verId, [int forceCodeResend]){
this.verificationId = verId;
smsCodeDialoge(context).then((value){
print('Signed In');
});
};
final PhoneVerificationCompleted verifiedSuccess = (AuthCredential auth){
print('verified');
};
final PhoneVerificationFailed verifyFailed = (AuthException e) {
print('${e.message}');
};
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: phoneNo,
timeout: const Duration(seconds: 5),
verificationCompleted: verifiedSuccess,
verificationFailed: verifyFailed,
codeSent: smsCodeSent,
codeAutoRetrievalTimeout: autoRetrieve,
);
}
Future<bool> smsCodeDialoge(BuildContext context){
return showDialog(context: context,
barrierDismissible: false,
builder: (BuildContext context) {
return new AlertDialog(
title: Text('Enter OTP'),
content: TextField(
onChanged: (value) {
this.smsId = value;
},
),
contentPadding: EdgeInsets.all(10.0),
actions: <Widget>[
new FlatButton(
onPressed: (){
FirebaseAuth.instance.currentUser().then((user){
if(user != null){
Navigator.of(context).pop();
Navigator.push(
context,
MaterialPageRoute(builder: (context) => Dash()),
);
}
else{
Navigator.of(context).pop();
signIn(smsId);
}
}
);
},
child: Text('Done', style: TextStyle( color: Colors.blue),))
],
);
},
);
}
Future<void> signIn(String smsCode) async {
final AuthCredential credential = PhoneAuthProvider.getCredential(
verificationId: verificationId,
smsCode: smsCode,
);
await FirebaseAuth.instance.signInWithCredential(credential)
.then((user){
Navigator.of(context).pushReplacementNamed('/loginpage');
}).catchError((e){
print(e);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Sign In')
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Phone Auth',style: TextStyle(fontSize: 20,color: Colors.blue),),
Padding(
padding: const EdgeInsets.all(16.0),
child: TextField(
decoration: InputDecoration(
hintText: 'Enter your phone number',
),
onChanged: (value){
this.phoneNo = value;
},
),
),
SizedBox(height: 10.0),
RaisedButton(
onPressed: verifyPhone,
child: Text('Verify', style: TextStyle(color: Colors.white),),
elevation: 7.0,
color: Colors.blue,
)
],
),
);
}
}