Flutter状态管理插件estado的使用
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
更多关于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
插件进行基本的状态管理。你可以根据需要扩展这个示例,以处理更复杂的状态管理需求。