安装

将以下行添加到您的 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。

GitHub

查看 Github