Flutter状态管理插件states_rebuilder的使用
Flutter状态管理插件states_rebuilder的使用
简介
states_rebuilder
是一个用于Flutter应用程序的状态管理库,它具有以下特点:
- 代码清晰:分离UI和业务逻辑、零样板代码、纯Dart编写业务逻辑。
- 性能优越:支持不可变/可变状态、可预测且可控、严格控制重建。
- 用户友好:优雅轻量级语法、在无状态小部件中使用
SetState
和动画、无需BuildContext
的导航、内置依赖注入系统。 - 高效生产:易于CRUD开发、用户认证授权、应用主题和多语言管理、易于测试和模拟依赖。
安装与导入
-
安装包:
- 使用Flutter命令安装:
flutter pub add states_rebuilder
- 或者在
pubspec.yaml
中添加依赖:dependencies: states_rebuilder: ^5.0.0
- 使用Flutter命令安装:
-
导入库:
import 'package:states_rebuilder/states_rebuilder.dart';
基本用法示例
1. 创建计数器应用
业务逻辑类(ViewModel)
class Counter {
final int value;
Counter(this.value);
@override
String toString() => 'Counter($value)';
}
@immutable
class ViewModel {
final counter1 = 0.inj();
final counter2 = RM.inject<Counter>(
() => Counter(0),
undoStackLength: 8,
debugPrintWhenNotifiedPreMessage: 'counter2',
);
int get sum => counter1.state + counter2.state.value;
void incrementCounter1() {
counter1.state++;
}
void incrementCounter2() {
counter2.state = Counter(counter2.state.value + 1);
}
}
全局实例化ViewModel
final viewModel = ViewModel();
UI部分(CounterApp)
class CounterApp extends ReactiveStatelessWidget {
const CounterApp();
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Counter1View(), // Not const to make it rebuildable
const Counter2View(), // Notice the use of const modifier (good approach)
Text('Result: ${viewModel.sum}'), // Will be updated when sum changes
],
),
),
);
}
}
class Counter1View extends StatelessWidget {
const Counter1View({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
ElevatedButton(
child: const Text('Counter1 ++'),
onPressed: () => viewModel.incrementCounter1(),
),
Text('Counter1 value: ${viewModel.counter1.state}'),
],
);
}
}
class Counter2View extends ReactiveStatelessWidget {
const Counter2View({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
children: [
ElevatedButton(
child: const Text('Counter2 ++'),
onPressed: () => viewModel.incrementCounter2(),
),
ElevatedButton(
child: const Text('Undo'),
onPressed: () => viewModel.counter2.undoState(),
),
Text('Counter2 value: ${viewModel.counter2.state.value}'),
],
);
}
}
2. 注册并监听状态变化
使用OnReactive
或ReactiveStatelessWidget
来注册并监听状态变化。例如,在CounterApp
中,我们使用了ReactiveStatelessWidget
来自动注册并监听状态变化。
3. 状态持久化
可以通过设置persist
参数来实现状态的持久化:
final model = RM.inject<MyModel>(
() => MyModel(),
persist: () => PersistState(
key: 'modelKey',
toJson: (MyModel s) => s.toJson(),
fromJson: (String json) => MyModel.fromJson(json),
throttleDelay: 1000,
),
);
4. 动态主题切换
动态切换主题可以通过RM.injectTheme
来实现:
final theme = RM.injectTheme<String>(
lightThemes: {
'simple': ThemeData.light(...),
'solarized': ThemeData.light(...),
},
darkThemes: {
'simple': ThemeData.dark(...),
'solarized': ThemeData.dark(...),
},
themeMode: ThemeMode.system,
persistKey: '__theme__',
);
// 切换主题
theme.state = 'solarized';
// 切换深浅模式
theme.toggle();
5. 国际化与本地化
通过RM.injectI18N
实现国际化和本地化:
final i18n = RM.injectI18N<EnUS>(
{
Locale('en', 'US'): () => EnUS(),
Locale('es', 'ES'): () => EsEs(),
},
persistKey: '__lang__',
);
Text(i18n.of(context).helloWorld);
总结
states_rebuilder
提供了一种简洁且功能强大的方式来进行Flutter应用的状态管理。通过上述基本用法和示例代码,您可以快速上手并在实际项目中应用该库。更多高级功能和详细信息可以参考官方文档和示例项目。
更多关于Flutter状态管理插件states_rebuilder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态管理插件states_rebuilder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter开发中,states_rebuilder
是一个强大的状态管理插件,它允许开发者以声明式的方式高效地管理应用状态。下面是一个关于如何使用 states_rebuilder
的代码示例,展示了其基本用法。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 states_rebuilder
依赖:
dependencies:
flutter:
sdk: flutter
states_rebuilder: ^x.x.x # 请替换为最新版本号
然后运行 flutter pub get
来安装依赖。
2. 创建一个全局状态管理
通常,你会创建一个全局的状态管理类来持有应用的状态。这里我们创建一个简单的计数器状态类:
import 'package:states_rebuilder/states_rebuilder.dart';
class CounterState with RebuildNotifier {
int count = 0;
void increment() {
count++;
notifyListeners(); // 通知监听者状态已更改
}
}
3. 在应用中使用状态管理
接下来,在你的 Flutter 应用中使用 states_rebuilder
来管理这个状态。
import 'package:flutter/material.dart';
import 'package:states_rebuilder/states_rebuilder.dart';
import 'counter_state.dart'; // 假设你的状态类放在这个文件里
void main() {
// 创建全局状态实例
final CounterState counterState = CounterState();
runApp(Rebuilder(
builder: () => MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('States Rebuilder Demo'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Rebuilder<CounterState>(
builder: (context, state, widget) => Text(
'${state.count}',
style: Theme.of(context).textTheme.headline4,
),
model: counterState,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
counterState.increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
),
),
));
}
代码解释
-
创建全局状态实例:
final CounterState counterState = CounterState();
-
使用
Rebuilder
包裹整个应用:runApp(Rebuilder( builder: () => MaterialApp(...), ));
-
在需要监听状态变化的组件上使用
Rebuilder<T>
:Rebuilder<CounterState>( builder: (context, state, widget) => Text( '${state.count}', style: Theme.of(context).textTheme.headline4, ), model: counterState, ),
-
更新状态: 当按钮被点击时,调用
counterState.increment()
来更新状态,这将触发所有监听这个状态的Rebuilder
组件重建。
总结
以上代码展示了如何使用 states_rebuilder
插件在 Flutter 应用中进行状态管理。通过创建状态类并使用 Rebuilder
组件监听这些状态,你可以轻松地在应用中管理复杂的状态逻辑。