安装
将以下行添加到您的 pubspec.yaml 依赖项中
estado: ^0.0.2
一个与框架无关的、基于 MVVM 的状态管理库
是否厌倦了将 Flutter Widget 与一些 Provider 类粘合在一起?您所要做的就是使用纯 Flutter API 来编写您的应用程序。突然之间,您需要用 Providers 和其他类来包装您的组件,以便共享数据。Estado 是 MVVM(Model-View-ViewModel)的一个平台和框架无关的实现。它分离了 UI 的状态,并且不会强迫您用一些烦人的 Providers 或 Controllers 来包装您的 UI 组件类。它不为您执行依赖注入、导航或任何其他操作。需要共享状态?好吧,将您的 ViewModel 类设为静态,然后自行订阅/取消订阅 Widget 到/从 ViewModel。这个库所做的就是为您提供工具,将您的 UI 状态完全从您的 Views / Widgets 中分离出来。您的实际状态类(ViewModel)与 Flutter 完全解耦,您可以 100% 进行单元测试。
您不必学习任何魔法,状态管理完全掌握在您手中,并且您的 build 方法将不再需要任何 Providers 或其他东西。
特点
只是一个不会触碰您 UI 代码的框架无关的状态管理。
入门
想想您的 UI 应该如何表现,您需要哪些状态?为您的 Stateful Widget 创建一个 ViewModel,然后从中调用您的数据或域层。然后您发出一个新状态,您的 UI 将处理该状态。您的 Flutter Widget 的 build() 方法将完全不受任何状态管理库的影响,正如它应该的那样。您可以专注于使用 Flutter SDK 或其他 UI 库编写您的 UI。
用法
以下是一个简单的代码片段,展示了如何使用此库将状态与 UI 分离
class LoginViewModel extends ViewModel {
void logIn(String email, String password) {
// LoadingState could be a State defined in a common package or so
notify(LoadingState(isLoading: true));
authRepository.login(email, password);
// let's assume login was successful
notifyState(LoadingState(isLoading: false));
notify(LoginSuccessfulState());
}
}
class LoginSuccessfulState extends ViewState{
static String name = "LoginSuccessful";
LoginSuccessfulState() : super(name);
}
class LoginUiState extends State<LoginUi>
with ViewModelObserver implements StateObserver {
LoginViewModel vm = getViewModel(); // use your DI lib or own factory, its up to you
void initState() {
super.initState();
vm.subscribe(this);
}
void deactivate() {
super.deactivate();
vm.unsubscribe(this);
}
void _handleLoginSuccessfulState(LoginSuccessfulState state) {
this.setState({
loggedIn: true
});
}
@override
Map<String, Function> getHandleStateFunctions() {
return {
LoadingState.name: (LoadingState state) => setState({isLoading: state.isLoading}),
LoginSuccessfulState.name: _handleLoginSuccessfulState
};
}
}
附加信息
如果您希望为此做出贡献,请随时在 GitHub 存储库上创建 PR。对于错误或功能请求,您可以创建 Issue。