Flutter中的每个数据流或每个ViewModel流-建议使用哪个?

时间:2019-09-11 10:01:10

标签: flutter dart bloc

我在Flutter应用程序中使用BLoC模式进行状态管理,并且使用了这两种方法来管理状态数据。e

1. making each piece of data have its own stream and using StreamBuilder for each widget that needs the data in the UI 

    class LoginBloc{
      bool _isLoggedIn;
      String _username;
      String _password;


      final _isloggedInSubject = BehaviorSubject<bool>();
      StreamSink<bool> get isLoggedInSink => _isloggedInSubject.sink;

      final _usernameSubject = BehaviorSubject<String>();
      StreamSink<String> get userNameSink => _usernameSubject.sink;
      //... //same for the other states

      bool login(){
        _service.Login(_usernameSubject.value,...);
      }
    }

2. Wrapping all page state in a view model and then making just one stream of that viewmodel

    class LoginBloc{
      final loginPageSubject = BehaviorSubject<LoginPageState>();

      bool login(){
        _service.Login(loginPageSubject.value.username, loginPageState.value.password);
      }

    }

    class LoginPageState{
      bool isLoggedIn;
      String username;
      String password;

      LoginPageState({this.isLoggedIn, this.username, this.password});

    }

我相信选项1可以这样工作。如果流发生更改,则只有在其streambuilder中使用该流的窗口小部件才会被重建。但是,选项2表示,即使共享状态相同的所有小部件都不会重建,即使它们在该状态下绑定的属性没有改变,它们也会全部重建,这是操作LoginPageState对象并将其重新添加到通过_loginPageSubject.sink流。

与选项2相比,选项1似乎涉及很多代码,如果您有很多状态数据(大量的BehaviorSubject和Observables),则选项2仅需要一个BehaviorSubject来管理一个状态对象中包含的所有状态。使用一个选项优于另一个选项是否可以提高性能?

0 个答案:

没有答案