如何解决Flutter/Dart 如何将用户 uid 从 firebase 转换为变量?
我试图从 Firebase 获取 uid 并将其放入一个变量中,以便在另一个类中使用它,但到目前为止我所做的最大值是将主页中的值显示为文本。当我尝试在主页中创建 final String riderId = snapshot.data.uid;
时,它会打印错误:
getter 'uid' 被调用为 null。 接收器:空 尝试调用:uid
我已经在 youtube 上的 stackoverflow 和教程中看到了其他问题,但没有一个对我有用!
我的主页:
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...');
},},);}}
我的登录按钮
RaisedButton(
onpressed: () {
context.read<AuthenticationService>().signIn(
email: emailController.text.trim(),password: passwordController.text.trim(),);
},child: Text("Sign in"),),
我的 main.dart
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(...
我的身份验证服务页面
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);
}
}
解决方法
尝试使用 authStateChanges()
Stream<User> get authStateChanges => FirebaseAuth.instance.authStateChanges();
或
Stream<User> get authStateChanges => FirebaseAuth.instance.userChanges();
,
流可以发出 null
作为第一个事件。因此,您应该始终在执行 uid
检查或检查是否 null
:
snapshot.hasData
@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...');
},},);}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。