Flutter状态管理插件simple_state的使用
Flutter状态管理插件simple_state的使用
简介
什么是SimpleState?
它是一个Flutter包,使得应用程序的反应式数据可以轻松连接到用户界面。
安装
在pubspec.yaml
文件中添加依赖:
dependencies:
simple_state: [latest-version]
使用
简单的可观察对象
为了处理最简单的对象,我们使用Observable<T>
,它可以通知观察者值的变化,但不会处理集合或对象内容的变化。
import 'package:simple_state/simple_state.dart';
import 'package:flutter/material.dart';
void main() => runApp(
MaterialApp(
home: SimpleObservable(),
),
);
class SimpleObservable extends StatelessWidget {
SimpleObservable({super.key});
final _simpleObservable = Observable('Hello');
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
// 观察者每次监听到变化时都会触发
child: Observer(
builder: (_) => Text(_simpleObservable.value),
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.flutter_dash),
// 更改可观察对象的值
onPressed: () => _simpleObservable.value += '\nWorld',
),
),
);
}
}
集合的可观察对象
为了处理集合,实现了三个类:ObservableList<T>
,ObservableMap<K,V>
和 ObservableSet<T>
。当向集合中添加/更改/删除元素时,观察者会收到通知。
import 'package:simple_state/simple_state.dart';
import 'package:flutter/material.dart';
void main() => runApp(
MaterialApp(
home: CollectionsObservable(),
),
);
class CollectionsObservable extends StatelessWidget {
CollectionsObservable({super.key});
final _listObservable = ObservableList([0]);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
// 观察者每次监听到变化时都会触发
child: Observer(
builder: (_) => ListView.builder(
itemCount: _listObservable.length,
itemBuilder: (_, i) => Text(_listObservable[i].toString()),
),
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.flutter_dash),
// 向可观察列表添加元素
onPressed: () => _listObservable.add(_listObservable.length),
),
),
);
}
}
自定义的可观察对象
你也可以实现复杂的对象,这些对象可以通知观察者它们的变化。
import 'package:simple_state/simple_state.dart';
import 'package:flutter/material.dart';
void main() => runApp(
MaterialApp(
home: CustomObservable(),
),
);
class CustomTitleObservable extends ChangeNotifier {
CustomTitleObservable([String? title]) : _title = title;
String? _title;
String get title => _title ?? '';
set title(String value) {
_title = value;
notifyListeners();
}
}
class CustomObservable extends StatelessWidget {
CustomObservable({super.key});
late final _customObservable = CustomTitleObservable('#');
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
// 观察者每次监听到变化时都会触发
child: Observer(
builder: (_) => Text(_customObservable.title),
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.flutter_dash),
// 更改自定义可观察对象的值
onPressed: () => _customObservable.title += '!',
),
),
);
}
}
反应
反应本质上是对变化的订阅。你可以创建一个反应 Reaction.when
,它返回一个类型为 Reaction
的对象。要移除反应,必须调用 removeListeners()
。你还可以创建异步反应 Reaction.asyncWhen
。你也可以在小部件树中使用 ReactionWidget
小部件来使用反应。
import 'package:simple_state/simple_state.dart';
import 'package:flutter/material.dart';
void main() => runApp(
const MaterialApp(
home: ReactionObservable(),
),
);
class ReactionObservable extends StatefulWidget {
const ReactionObservable({super.key});
[@override](/user/override)
_ReactionObservableState createState() => _ReactionObservableState();
}
class _ReactionObservableState extends State<ReactionObservable> {
late final _exampleMap = ObservableMap<int, String>({});
late final Reaction _reaction;
[@override](/user/override)
void initState() {
// 创建一个反应,当映射长度达到五个元素时清空映射
_reaction = Reaction.when(
condition: () => _exampleMap.length == 5,
reaction: _exampleMap.clear,
);
super.initState();
}
[@override](/user/override)
void dispose() {
// 删除反应订阅
_reaction.removeListeners();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
// 观察者每次监听到变化时都会触发
child: Observer(
builder: (_) => ListView.builder(
itemCount: _exampleMap.length,
itemBuilder: (_, i) => Text(_exampleMap[i] ?? ''),
),
),
),
floatingActionButton: FloatingActionButton(
child: const Icon(Icons.flutter_dash),
// 向可观察映射添加元素
onPressed: () => _exampleMap[_exampleMap.length] = 'Item ${_exampleMap.length}',
),
),
);
}
}
更多关于Flutter状态管理插件simple_state的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态管理插件simple_state的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用simple_state
插件进行状态管理的一个简单示例。simple_state
是一个轻量级的状态管理库,它允许你轻松地管理应用的状态。
1. 添加依赖
首先,你需要在pubspec.yaml
文件中添加simple_state
的依赖:
dependencies:
flutter:
sdk: flutter
simple_state: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来获取依赖。
2. 创建状态类
接下来,你需要创建一个状态类。这个类将包含你想要管理的状态数据以及任何更新状态的方法。
import 'package:simple_state/simple_state.dart';
class CounterState extends State<int> {
CounterState() : super(0);
void increment() {
this.state = this.state + 1;
}
}
在这个例子中,CounterState
管理一个整数值,并提供了一个increment
方法来增加这个值。
3. 在小部件中使用状态
现在,你可以在你的Flutter小部件中使用这个状态类。你需要使用Provider
来包裹你的应用或特定的小部件树,并使用consume
来访问和监听状态的变化。
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:simple_state/simple_state.dart';
import 'counter_state.dart'; // 假设你把状态类放在这个文件里
void main() {
runApp(
Provider<CounterState>.value(
value: CounterState(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final counterState = consume<CounterState>();
return Scaffold(
appBar: AppBar(
title: Text('Flutter Demo Home Page'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${counterState.state}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
final counterState = consume<CounterState>();
counterState.increment();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
在这个例子中,我们创建了一个简单的Flutter应用,其中包含一个按钮和一个显示计数的文本。当按钮被按下时,CounterState
的increment
方法被调用,从而更新状态,并且由于consume
的使用,UI会自动重新渲染以反映新的状态。
注意事项
simple_state
与provider
库一起使用,因此你需要确保你的项目中已经包含了provider
库的依赖。- 使用
consume
来获取状态时,如果状态在树的更高层没有被提供,它将抛出一个错误。因此,确保你的Provider
正确包裹了你的应用或相关的小部件树。
希望这个示例能帮助你理解如何在Flutter项目中使用simple_state
进行状态管理。