如何使用 bloc 在 flutter 中导航
How to navigate in flutter with bloc
我有一个 login/signup 页面。当用户注册时,我调用我的 bloc 代码并进行 firebase 注册。现在,当我完成注册时,我希望将应用程序重定向到主页。我怎样才能控制来自集团的导航流程?
我尝试在 material 应用的 'home' 中使用 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 });
});
});
}
}
我认为父 StreamBuilder
中的身份验证状态流应该有效?在我看来,那将是最好的方式。
一个选项是向您的集团添加一个新的流,例如 Stream<String> get doNavigate
,并在您希望小部件导航到某个地方时向其添加事件。您可以将导航操作视为来自您的集团的另一个输出流。
另一种选择是扩大 isLoading
的范围以包括登录状态等信息。您可以拥有一个包含所有可能状态的枚举,例如:
enum Status { signedOut, loading, signedIn }
然后从您的集团公开它,而不仅仅是加载状态:
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);
});
}
}```
我有一个 login/signup 页面。当用户注册时,我调用我的 bloc 代码并进行 firebase 注册。现在,当我完成注册时,我希望将应用程序重定向到主页。我怎样才能控制来自集团的导航流程?
我尝试在 material 应用的 'home' 中使用 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 });
});
});
}
}
我认为父 StreamBuilder
中的身份验证状态流应该有效?在我看来,那将是最好的方式。
一个选项是向您的集团添加一个新的流,例如 Stream<String> get doNavigate
,并在您希望小部件导航到某个地方时向其添加事件。您可以将导航操作视为来自您的集团的另一个输出流。
另一种选择是扩大 isLoading
的范围以包括登录状态等信息。您可以拥有一个包含所有可能状态的枚举,例如:
enum Status { signedOut, loading, signedIn }
然后从您的集团公开它,而不仅仅是加载状态:
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);
});
}
}```