【发布时间】:2020-02-11 14:18:58
【问题描述】:
首先提前感谢,我尝试创建一个应用程序并尝试使用它,首先我在应用程序中管理用户的状态登录,为此我使用本指南https://fireship.io/lessons/flutter-firebase-google-oauth-firestore/该应用程序按预期工作登录页面中的 facebook 登录(observable 发出一个新值并使用 StreamBuilder 创建相应的小部件一切正常!),但是当我按下返回按钮到其他页面并再次进入登录页面时,与 StreamBuilder 小部件关联的流返回因此 null 再次显示 formLogin(要注册的表单)小部件而不是配置文件小部件(显示用户信息的小部件),或者我使用错误的 streamBuilder 任何建议都很好。
我放代码
再次提前感谢
Login Widget(用于管理登录和用户信息的小部件)和 AuthService(用于登录的逻辑)
ProfilePage({Key key}) : super(key: key);
_ProfilePageState createState() => _ProfilePageState();
}
class _ProfilePageState extends State<ProfilePage>
with TickerProviderStateMixin {
var opacity = true;
AnimationController _controller;
Animation<double> _animation;
bool _loading = false;
final GlobalKey<FormState> _formKeyLogin = GlobalKey<FormState>();
final GlobalKey<FormState> _formKeyLogup = GlobalKey<FormState>();
final PageController _pageController = PageController();
int _typeForm = 0;
// int currentPage = 1;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this, duration: Duration(milliseconds: 1500));
_animation = CurvedAnimation(
parent: _controller,
curve: Curves.decelerate,
);
_controller.forward();
authService.loading.listen((state) => setState(() => _loading = state));
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Stack(
children: <Widget>[
StreamBuilder(
stream: authService.profile,
builder: (context, snapshot) {
if (snapshot.hasData) {
User user = User.mapFromMap(snapshot.data);
return new FormProfile(loading: _loading, user: user);
} else {
return new FormLogin(
animation: _animation,
loading: _loading,
pageController: _pageController,
formKeyLogin: _formKeyLogin,
formKeyLogup: _formKeyLogup);
}
},
)
],
),
),
);
}
}
class AuthService {
final GoogleSignIn _googleAuth = GoogleSignIn();
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final Firestore _firestore = Firestore.instance;
bool isAdmin = false;
Observable<FirebaseUser> user; //FirebaseUser instance
Observable<Map<String, dynamic>> profile; //database's user info
PublishSubject loading = PublishSubject();
AuthService() {
user = Observable(_firebaseAuth.onAuthStateChanged);
profile = user.switchMap((FirebaseUser u) {
if (u != null) {
return _firestore
.collection("users")
.document(u.uid)
.snapshots()
.map((snap) => snap.data);
} else {
return Observable.just(null);
}
});
}
Future<FirebaseUser> facebookLogin() async {
loading.add(true);
final facebookLogin = FacebookLogin();
final result = await facebookLogin.logInWithReadPermissions(['email']);
FirebaseUser user;
switch (result.status) {
case FacebookLoginStatus.loggedIn:
final AuthCredential credential = FacebookAuthProvider.getCredential(
accessToken: result.accessToken.token);
try {
user = await _firebaseAuth.signInWithCredential(credential);
await validateAccount(user);
updateUserData(user);
} on PlatformException catch (e) {
switch (e.code) {
case Strings.AUTH_CONST_ERROR_INVALID_CREDENTIAL:
Utilities.showToast(
Strings.AUTH_CONST_ERROR_INVALID_CREDENTIAL_MSG,
Toast.LENGTH_LONG,
2);
break;
case Strings.AUTH_CONST_ERROR_USER_DISABLED:
Utilities.showToast(Strings.AUTH_CONST_ERROR_USER_DISABLED_MSG,
Toast.LENGTH_LONG, 2);
break;
case Strings
.AUTH_CONST_ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL:
Utilities.showToast(
Strings
.AUTH_CONST_ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL_MSG,
Toast.LENGTH_LONG,
2);
break;
case Strings.AUTH_CONST_ERROR_OPERATION_NOT_ALLOWED:
Utilities.showToast(
Strings.AUTH_CONST_ERROR_OPERATION_NOT_ALLOWED_MSG,
Toast.LENGTH_LONG,
2);
break;
case Strings.AUTH_CONST_ERROR_INVALID_ACTION_CODE:
Utilities.showToast(
Strings.AUTH_CONST_ERROR_INVALID_ACTION_CODE_MSG,
Toast.LENGTH_LONG,
2);
break;
default:
Utilities.showToast(Strings.AUTH_CONST_ERROR_GENERAL_CODE_MSG,
Toast.LENGTH_LONG, 2);
}
}
break;
case FacebookLoginStatus.cancelledByUser:
break;
case FacebookLoginStatus.error:
Utilities.showToast(result.errorMessage, Toast.LENGTH_SHORT, 2);
//_showErrorOnUI(result.errorMessage);
break;
}
loading.add(false);
return user;
}
final AuthService authService = AuthService();
【问题讨论】:
-
如果您需要重新加载 Stream,那么您需要将其调用到 initState,此链接可以帮助您 - inducesmile.com/google-flutter/…
标签: flutter