【问题标题】:How to navigate in flutter with bloc如何在 bloc 中导航
【发布时间】:2019-07-10 05:38:16
【问题描述】:

我有一个登录/注册页面。当用户注册时,我会调用我的 bloc 代码并进行 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 });


        });

      });
    }


  }

【问题讨论】:

    标签: flutter bloc


    【解决方案1】:

    我认为父 StreamBuilder 中的身份验证状态流应该可以工作吗?在我看来,这将是最好的方式。

    一个选项是向您的集团添加一个新流,例如Stream&lt;String&gt; 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);
        });
      }
    }```
    

    【讨论】:

    • 是的,这是一个不错的选择。我使用一个定义我的主屏幕的枚举。因此,基于 firebase 的当前身份验证状态,我更改了枚举值,然后在我的应用程序的家中监听该流。这对我有用,谢谢
    猜你喜欢
    • 2020-05-06
    • 2019-06-13
    • 2019-06-04
    • 2021-05-20
    • 2019-07-05
    • 2021-10-21
    • 1970-01-01
    • 2022-10-30
    • 2019-01-05
    相关资源
    最近更新 更多