我有一个登录/注册页面。当用户注册时,我会调用我的集团代码并进行Firebase注册。现在,当我完成注册后,我希望将应用程序重定向到主页。如何控制集团的导航流程?
我尝试在材料应用程序的“主页”中使用firebase authstatechanges流,但仅在应用程序首次启动时有效。我已经加载了注册页面后,它不起作用。
我还创建了一种方法,用于侦听在用户注册后更改的流布尔值,但是该方法未收到任何更新。
class EventsBloc{
final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
Sink<User> get doSignup => _signupController.sink;
final _signupController = StreamController<User>();
Stream<bool> get isLoading => _isLoadingSubject.stream;
final _isLoadingSubject = BehaviorSubject<bool>(seedValue: false);
EventsBloc()
{
_signupController.stream.listen((user){
_isLoadingSubject.add(true);
firebaseAuth.createUserWithEmailAndPassword(email: user.email, password: user.password).then((firebaseUser) {
_isLoadingSubject.add(false);
// I WANT TO NAVIGATE TO THE HOME PAGE HERE
Firestore.instance.collection('user').document()
.setData({ 'email': user.email, 'phone': user.phoneNumber, 'name': user.name });
});
});
}
}
答案 0 :(得分:1)
我认为父StreamBuilder
中的auth状态流应该起作用吗?我认为那是最好的方法。
一个选择是将一个新的流添加到您的块中,例如Stream<String> get doNavigate
,并在您希望小部件导航到某个地方时向其中添加事件。您可以将导航操作视为来自集团的另一个输出流。
另一种选择是扩展isLoading
的范围,使其也包括登录状态之类的信息。您可能拥有一个具有所有可能状态的枚举:
enum Status { signedOut, loading, signedIn }
然后从您的bloc中公开它,而不仅仅是加载状态:
class EventBloc {
// ...
Stream<Status> get status => _statusSubject.stream;
final _statusSubject = BehaviorSubject<Status>(seedValue: Status.signedOut);
EventsBloc() {
_signupController.stream.listen((user) async {
_statusSubject.add(Status.loading);
final firebaseUser = await firebaseAuth.createUserWithEmailAndPassword(
email: user.email,
password: user.password,
);
Firestore.instance.collection('user').document().setData(
{'email': user.email, 'phone': user.phoneNumber, 'name': user.name});
_statusSubject.add(Status.signedIn);
});
}
}```