颤振/飞镖如何在变量中转换firebase中的用户uid?
我试图从Firebase获取uid并将其放入一个变量中,以便在另一个类中使用它,但到目前为止,我所做的最大努力是在主页中将该值显示为文本。当我尝试创建颤振/飞镖如何在变量中转换firebase中的用户uid?,firebase,flutter,dart,firebase-authentication,uid,Firebase,Flutter,Dart,Firebase Authentication,Uid,我试图从Firebase获取uid并将其放入一个变量中,以便在另一个类中使用它,但到目前为止,我所做的最大努力是在主页中将该值显示为文本。当我尝试创建最终字符串riderId=snapshot.data.uid在主页中,它会打印错误: 对null调用了getter“uid”。 收件人:空 已尝试呼叫:uid 我已经在stackoverflow和youtube上的教程中看到了其他问题,但没有一个对我有用 我的主页: class HomePage extends StatelessWidget {
最终字符串riderId=snapshot.data.uid
在主页中,它会打印错误:
对null调用了getter“uid”。
收件人:空
已尝试呼叫:uid
我已经在stackoverflow和youtube上的教程中看到了其他问题,但没有一个对我有用
我的主页:
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
// print(riderId);
return StreamBuilder(
stream: AuthenticationService().authStateChanges,
builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
// final String riderId = snapshot.data.uid;
if (snapshot.hasData) {
return Center(
child: Text(snapshot.data.uid),
);
} else {
return Text('Loading...');
},},);}}
类主页扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
//打印(riderId);
返回流生成器(
流:AuthenticationService().authStateChanges,
生成器:(BuildContext上下文,异步快照){
//最后一个字符串riderId=snapshot.data.uid;
if(snapshot.hasData){
返回中心(
子项:文本(snapshot.data.uid),
);
}否则{
返回文本('加载…');
},},);}}
我的登录按钮
RaisedButton(
onPressed: () {
context.read<AuthenticationService>().signIn(
email: emailController.text.trim(),
password: passwordController.text.trim(),
);
},
child: Text("Sign in"),
),
RaisedButton(
已按下:(){
context.read().sign(
电子邮件:emailController.text.trim(),
密码:passwordController.text.trim(),
);
},
子项:文本(“登录”),
),
我的主飞镖
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MultiProvider(
providers: [
Provider<AuthenticationService>(
create: (_) => AuthenticationService(),
),
StreamProvider(
create: (context) =>
context.read<AuthenticationService>().authStateChanges,
)
],
child: MaterialApp(...
类MyApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
回程多供应商(
供应商:[
提供者(
创建:()=>AuthenticationService(),
),
流提供者(
创建:(上下文)=>
context.read().authStateChanges,
)
],
孩子:MaterialApp(。。。
我的身份验证服务页面
class AuthenticationService {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
Stream<User> get authStateChanges => _firebaseAuth.idTokenChanges();
Future<UserModel> signIn({String email, String password}) async {
var result = await _firebaseAuth.signInWithEmailAndPassword(
email: email, password: password);
return UserModel(result.user.uid);
}
}
类身份验证服务{
final FirebaseAuth _FirebaseAuth=FirebaseAuth.instance;
Stream get-authStateChanges=>\u firebaseAuth.idTokenChanges();
未来登录({String email,String password})异步{
var result=await\u firebaseAuth.signiWithEmailAndPassword(
电子邮件:电子邮件,密码:密码);
返回UserModel(result.user.uid);
}
}
尝试使用authStateChanges()
Stream get authStateChanges=>FirebaseAuth.instance.authStateChanges();
或
Stream get authStateChanges=>FirebaseAuth.instance.userChanges();
流可以作为第一个事件发出null
。因此,在执行null
检查或检查snapshot.hasData
后,应始终访问uid
:
@override
Widget build(BuildContext context) {
// print(riderId);
return StreamBuilder(
stream: AuthenticationService().authStateChanges,
builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
// final String riderId = snapshot.data.uid; // <~~ you'll always get an error in the first event if it's null
if (snapshot.hasData) {
final String riderId = snapshot.data.uid; // <~~ here should be fine
return Center(
child: Text(snapshot.data.uid),
);
} else {
return Text('Loading...');
},},);}}
@凌驾
小部件构建(构建上下文){
//打印(riderId);
返回流生成器(
流:AuthenticationService().authStateChanges,
生成器:(BuildContext上下文,异步快照){
//最后一个字符串riderId=snapshot.data.uid;//谢谢您的回答,但还是一样!
Stream<User> get authStateChanges => FirebaseAuth.instance.userChanges();
@override
Widget build(BuildContext context) {
// print(riderId);
return StreamBuilder(
stream: AuthenticationService().authStateChanges,
builder: (BuildContext context, AsyncSnapshot<User> snapshot) {
// final String riderId = snapshot.data.uid; // <~~ you'll always get an error in the first event if it's null
if (snapshot.hasData) {
final String riderId = snapshot.data.uid; // <~~ here should be fine
return Center(
child: Text(snapshot.data.uid),
);
} else {
return Text('Loading...');
},},);}}