gpt4 book ai didi

Flutter:StreamBuilder 快照——无数据

转载 作者:行者123 更新时间:2023-12-04 01:27:16 26 4
gpt4 key购买 nike

我刚刚学习 Flutter,并尝试使用 StreamBuilder 在用户注销时显示登录/注册页面,或者在用户登录时显示个人资料页面。我的代码如下:

认证服务:

import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';

class AuthUser {
AuthUser({@required this.uid, @required this.email});
final String uid;
final String email;
}

abstract class AuthBase {
Future<AuthUser> currentUser();
Future<AuthUser> signIn({String email, String pw});
Future<AuthUser> registerUser({String email, String pw});
Stream<AuthUser> get onAuthStateChanged;
Future<void> signOut();
}

class Auth implements AuthBase {
final _firebaseAuth = FirebaseAuth.instance;

AuthUser _userFromFirebase(FirebaseUser user) {
if (user != null) {
return AuthUser(uid: user.uid, email: user.email);
} else {
return null;
}
}

@override
Stream<AuthUser> get onAuthStateChanged {
return _firebaseAuth.onAuthStateChanged.map(_userFromFirebase);
}

@override
Future<AuthUser> currentUser() async {
final user = await _firebaseAuth.currentUser();
return _userFromFirebase(user);
}

@override
Future<AuthUser> signIn({String email, String pw}) async {
final authResult = await _firebaseAuth.signInWithEmailAndPassword(email: email, password: pw);
return _userFromFirebase(authResult.user);
}

@override
Future<AuthUser> registerUser({String email, String pw}) async {
final authResult = await _firebaseAuth.createUserWithEmailAndPassword(email: email, password: pw);
return _userFromFirebase(authResult.user);
}

@override
Future<void> signOut() async {
await _firebaseAuth.signOut();
}
}

StreamBuilder:

class WelcomeScreen extends StatelessWidget {
WelcomeScreen({@required this.auth});
static const String id = '/';
final AuthBase auth;

@override
Widget build(BuildContext context) {
return StreamBuilder<AuthUser>(
stream: auth.onAuthStateChanged,
builder: (context, snapshot) {
if (snapshot.hasData) {
AuthUser user = snapshot.data;
if (user == null) {
return displayLoginOrRegPage(context);
} else {
return ProjectScreen(
user: user,
auth: auth,
);
}
} else {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
},
);
}

据我了解,流一旦初始化就会开始发出“null”,并且会继续这样做,直到它触发 Auth 状态更改...

但快照不断报告“无数据”,因此我的代码卡在 CircularProgressIndicator 上。

顺便说一句,如果我显示登录屏幕代替进度指示器,代码就可以工作。所以我显然不了解整个流初始化过程。

有人可以向我解释我在哪里出错了吗?提前一百万谢谢。

最佳答案

正如你提到的,当stream初始化时它发出null,但是当用户没有登录时,它仍然发出null,这stream 认为没有数据,即 null 这就是错误的原因。

您可以使用Streambuilder的连接状态来区分无用户null和初始化后的null。

希望下面的代码对你有所帮助。

  if (snapshot.connectionState == ConnectionState.active) {
if (snapshot.data == null) {
return displayLoginOrRegPage(context);
} else {
AuthUser user = snapshot.data;
return ProjectScreen(
user: user,
auth: auth,
);
}
} else {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}

关于Flutter:StreamBuilder 快照——无数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61670581/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com