Flutter状态管理插件estado的使用

发布于 1周前 作者 zlyuanteng 来自 Flutter

Flutter状态管理插件estado的使用

安装

在你的pubspec.yaml文件中添加以下依赖行:

  estado: ^0.0.8

一个基于MVVM的状态管理库(与框架无关)

是否曾经觉得用Provider类来粘合Flutter小部件很累?你只想使用纯Flutter API来编写应用程序。但突然间,你必须将组件包裹在Provider和其他类中,以便共享数据。Estado是一个平台和框架无关的MVVM(模型-视图-视图模型)实现。它将UI的状态与UI分离,并且不会强迫你用一些讨厌的Provider或Controller来包裹UI组件类。它不会为你执行依赖注入、导航或其他任何事情。如果你需要共享状态,可以将你的ViewModel类设置为静态,并自行订阅/取消订阅Widget到/从ViewModel。这个库只是给你提供了完全分离UI状态所需的工具。你的实际状态类(ViewModel)完全与Flutter解耦,你可以100%对其进行单元测试。

你不必学习任何魔法,状态管理再次完全由你自己掌控,你的构建方法也不需要任何Provider或其他东西。

特性

仅支持与框架无关的状态管理,不会触及你的UI代码。

开始使用

思考一下你的UI应该如何表现,你需要哪些状态? 为你的Stateful Widget创建一个ViewModel,并从中调用你的数据或领域层。然后你发出一个新的状态,你的UI会处理该状态。你的Flutter小部件的build()方法完全不受任何有关状态管理的库的影响,正如它应该的那样。你可以专注于使用Flutter SDK或其他UI库来编写UI。

使用示例

这是一个简单的代码片段,说明如何使用此库将状态与UI分离:

// 定义登录视图模型
class LoginViewModel extends EventViewModel {
  // 登录方法
  void logIn(String email, String password) {
    // 假设有一个名为LoadingState的状态类
    notify(LoadingEvent(isLoading: true));
    
    // 调用身份验证仓库进行登录
    authRepository.login(email, password);
    
    // 假设登录成功
    notify(LoadingEvent(isLoading: false));
    notify(OnLoginSuccessfulEvent());
  }
}

// 定义登录成功事件类
class LoginSuccessfulEvent extends ViewEvent {
  LoginSuccessfulEvent() : super();
}

// 定义登录UI状态类
class LoginUiState extends State<LoginUi> implements EventObserver {
  LoginViewModel vm = getViewModel(); // 使用你的DI库或自己的工厂,这取决于你

  // 初始化方法
  void initState() {
    super.initState();
    vm.subscribe(this);
  }

  // 反激活方法
  void deactivate() {
    super.deactivate();
    vm.unsubscribe(this);
  }

  // 通知方法
  [@override](/user/override)
  void notify(ViewModelEvent event) {
    if (event is LoginSuccessfulEvent) {
      this.setState({
        loggedIn: true
      });
    }
  }
}

更多关于Flutter状态管理插件estado的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter状态管理插件estado的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用estado插件进行状态管理的示例代码。estado是一个轻量级的状态管理库,适用于Flutter应用。以下是一个简单的例子,演示如何使用estado来管理应用的状态。

1. 添加依赖

首先,在pubspec.yaml文件中添加estado的依赖:

dependencies:
  flutter:
    sdk: flutter
  estado: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 创建一个状态类

接下来,我们创建一个简单的状态类,用于存储和管理应用的状态。例如,我们创建一个计数器状态类:

import 'package:estado/estado.dart';

class CounterState extends StateNotifier<int> {
  CounterState() : super(0) {
    // 初始化状态为0
  }

  void increment() {
    state += 1;
  }

  void decrement() {
    state -= 1;
  }
}

3. 使用状态类在UI中显示状态

然后,我们在UI组件中使用这个状态类。我们将使用use钩子来获取当前的状态,并使用onPressed回调来更新状态。

import 'package:flutter/material.dart';
import 'package:estado/hooks.dart';
import 'counter_state.dart'; // 导入上面创建的状态类

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ProviderScope(
      overrides: [
        CounterState.overrideWithValue(CounterState()),
      ],
      child: MaterialApp(
        home: CounterScreen(),
      ),
    );
  }
}

class CounterScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    final counter = use(context); // 使用use钩子获取CounterState实例

    return Scaffold(
      appBar: AppBar(
        title: Text('Counter Example'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '${counter.state}',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          counter.increment(); // 调用increment方法更新状态
        },
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
      floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
    );
  }
}

4. 使用ProviderScope覆盖状态(可选)

在上面的例子中,我们在MyApp组件中使用ProviderScope来覆盖CounterState的状态,这样可以在整个应用中共享这个状态。

5. 运行应用

现在,你可以运行这个Flutter应用,并看到一个计数器界面。当你点击浮动操作按钮时,计数器的值会增加。

这个示例展示了如何使用estado插件进行基本的状态管理。你可以根据需要扩展这个示例,以处理更复杂的状态管理需求。

回到顶部