我在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来管理一个状态对象中包含的所有状态。使用一个选项优于另一个选项是否可以提高性能?