Flutter状态持久化插件state_holder的使用
Flutter状态持久化插件state_holder的使用
StateHolder
StateHolder 是一个围绕 InheritedWidget
的封装,旨在使其更易于使用且更具可重用性。通过使用 StateHolder 而不是手动编写 InheritedWidget
,您可以获得以下好处:
- 资源分配简化
- 懒加载
- 大幅减少每次创建新类时的样板代码
- 对开发者工具友好
- 对具有指数级复杂度增长的监听机制(如
ChangeNotifier
)有更好的扩展性(O(N) 的通知分发)
添加依赖
在 pubspec.yaml
文件中更新依赖项:
dependencies:
state_holder:
git:
url: https://github.com/mishrabroshan/state_holder.git
组件
状态组件 | 访问组件 |
---|---|
SimpleStateHolder | SateHolder |
ChangeNotifierStateHolder | StateConsumer |
MultiStateHolder | StateHolderContext |
状态组件
SimpleStateHolder 组件
描述:
使用此组件初始化 [SimpleStateHolder]
,它仅用于保存状态而不会提供任何更改更新。
如何使用:
只需将此组件包裹到小部件中即可开始使用。
import 'package:state_holder/state_holder.dart';
SimpleStateHolder(
builder: (context) => "[State]", // 状态值
lazy: true/false, // 是否懒加载
child: SomeWidget(), // 子小部件
),
ChangeNotifierStateHolder 组件
描述:
使用此组件初始化 [ChangeNotifierStateHolder]
,它不仅保存状态还会提供更改更新。
注意:
ChangeNotifierStateHolder
只能与可监听组件一起使用。
如何使用:
同样,只需将其包裹到小部件中即可。
import 'package:state_holder/state_holder.dart';
ChangeNotifierStateHolder(
builder: (context) => "[State]", // 状态值
lazy: true/false, // 是否懒加载
child: SomeWidget(), // 子小部件
),
MultiStateHolder 组件
描述:
[StateHolder]
将多个状态持有者合并为单一线性小部件树。这样可以提高可读性并减少嵌套多个状态持有者的样板代码。
例如,从:
import 'package:state_holder/state_holder.dart';
StateHolder<Something>(
builder: (context) => Something(),
child: StateHolder<SomethingElse>(
builder: (context) => SomethingElse(),
child: StateHolder<AnotherThing>(
builder: (context) => AnotherThing(),
child: App(),
),
),
),
转换为:
import 'package:state_holder/state_holder.dart';
MultiStateHolder(
stateHolders: [
StateHolder<Something>(
builder: (context) => Something(),
),
StateHolder<SomethingElse>(
builder: (context) => SomethingElse(),
),
StateHolder<AnotherThing>(
builder: (context) => AnotherThing(),
),
],
child: App(),
),
访问组件
StateHolder 组件
描述:
提供简单接口以从任何地方访问状态组件。
方法:
StateHolder.of<T>(BuildContext context, [bool listen = false])
- 使用此方法获取最近的状态持有者,其中
[T]
是所需状态持有者的类型,context
是请求状态的小部件的上下文。 - 如果设置
[listen]
为true
,则会将此状态添加到上下文的依赖项中。每当状态内部的值发生变化时,依赖项会被重新构建。 - 默认情况下,参数为
false
。
注意:
只有 [ChangeNotifierStateHolder]
具有重建其依赖项的能力。
示例:
import 'package:state_holder/state_holder.dart';
// 在小部件树中的某个位置
MultiStateHolder(
stateHolders: [
StateHolder(
builder: (context) => "HelloWorld",
),
ChangeNotifierStateHolder(
builder: (context) => ValueNotifier(10),
),
],
child: SomeWidget(),
),
class SomeWidget extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
var nonListnableDaa = StateHolder.of<String>(context);
var listnableData = StateHolder.of<ValueNotifier<int>>(context, true);
return AnotherWidget();
}
}
StateConsumer 组件
描述:
获取 [StateHolder]
。
示例:
import 'package:state_holder/state_holder.dart';
// 在小部件树中的某个位置
StateHolder(
builder: (context) => "HelloWorld",
child: SomeWidget(),
)
Widget foo() {
return StateConsumer<String>(
builder: (context, state, child) {
return SomeWidget();
},
);
}
StateHolderContext 组件
描述:
[StateHolderContext]
是对 [BuildContext]
的扩展,提供了两种方法来读取和观察 [StateHolder]
的状态。
方法:
-
context.readStateHolder<T>();
- 使用此方法读取
[StateHolder]
的状态而不监听更新。 - 类似于:
StateHolder.of<T>(context, false);
- 使用此方法读取
-
context.watchStateHolder<T>();
- 使用此方法观察
[StateHolder]
的状态并监听更新。 - 类似于:
StateHolder.of<T>(context, true);
- 使用此方法观察
示例:
import 'package:state_holder/state_holder.dart';
// 在小部件树中的某个位置
StateHolder(
builder: (context) => "HelloWorld",
child: SomeWidget(),
)
class SomeWidget extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
String state = context.readStateHolder<String>();
ValueNotifier<int> listnableState = context.watchStateHolder<ValueNotifier<int>>();
return AnotherWidget();
}
}
更多关于Flutter状态持久化插件state_holder的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态持久化插件state_holder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
state_holder
是一个用于 Flutter 应用状态管理的插件,它允许你在应用的不同部分之间共享和持久化状态。使用 state_holder
,你可以轻松地管理应用的状态,并在需要时将其持久化到本地存储中。
安装 state_holder
首先,你需要在 pubspec.yaml
文件中添加 state_holder
依赖:
dependencies:
flutter:
sdk: flutter
state_holder: ^1.0.0 # 请使用最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
1. 创建一个状态持有者
首先,你需要创建一个继承自 StateHolder
的类来管理你的状态。
import 'package:state_holder/state_holder.dart';
class CounterStateHolder extends StateHolder {
int _count = 0;
int get count => _count;
void increment() {
_count++;
notifyListeners(); // 通知监听者状态已更新
}
[@override](/user/override)
Map<String, dynamic> toJson() {
return {'count': _count};
}
[@override](/user/override)
void fromJson(Map<String, dynamic> json) {
_count = json['count'] ?? 0;
}
}
2. 在应用中使用状态持有者
你可以在应用的任何地方使用 StateHolderProvider
来提供状态持有者,并使用 StateHolderConsumer
来监听状态的变化。
import 'package:flutter/material.dart';
import 'package:state_holder/state_holder.dart';
import 'counter_state_holder.dart'; // 导入你创建的状态持有者
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return StateHolderProvider(
stateHolder: CounterStateHolder(),
child: MaterialApp(
home: HomeScreen(),
),
);
}
}
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('State Holder Example'),
),
body: Center(
child: StateHolderConsumer<CounterStateHolder>(
builder: (context, stateHolder) {
return Text(
'Count: ${stateHolder.count}',
style: TextStyle(fontSize: 24),
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
StateHolder.of<CounterStateHolder>(context).increment();
},
child: Icon(Icons.add),
),
);
}
}
3. 持久化状态
state_holder
提供了 StateHolderPersistence
类来帮助你将状态持久化到本地存储中。你可以在应用启动时加载状态,并在应用关闭时保存状态。
import 'package:flutter/material.dart';
import 'package:state_holder/state_holder.dart';
import 'counter_state_holder.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 创建状态持有者
final counterStateHolder = CounterStateHolder();
// 从本地存储加载状态
await StateHolderPersistence.load(counterStateHolder);
runApp(MyApp(counterStateHolder: counterStateHolder));
}
class MyApp extends StatelessWidget {
final CounterStateHolder counterStateHolder;
MyApp({required this.counterStateHolder});
[@override](/user/override)
Widget build(BuildContext context) {
return StateHolderProvider(
stateHolder: counterStateHolder,
child: MaterialApp(
home: HomeScreen(),
),
);
}
}
class HomeScreen extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('State Holder Example'),
),
body: Center(
child: StateHolderConsumer<CounterStateHolder>(
builder: (context, stateHolder) {
return Text(
'Count: ${stateHolder.count}',
style: TextStyle(fontSize: 24),
);
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
StateHolder.of<CounterStateHolder>(context).increment();
},
child: Icon(Icons.add),
),
);
}
}
// 在应用关闭时保存状态
class MyAppState extends State<MyApp> {
[@override](/user/override)
void dispose() {
StateHolderPersistence.save(widget.counterStateHolder);
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Container();
}
}