Flutter状态管理插件state_mgr的使用
Flutter状态管理插件state_mgr的使用
state_mgr
是一个用于 Flutter 应用的状态管理库。它允许你在不使用 StatefulWidget
的情况下管理对象的状态。
ChangeLog
关于
该插件允许你管理对象的状态,而不需要使用 StatefulWidget
。状态管理器可以让你将模型的状态管理和其展示逻辑分开。
使用
下面是一个基本的应用示例,展示了如何使用 state_mgr
库。
import 'package:flutter/material.dart';
import 'package:state_mgr/state_mgr.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const MaterialApp(
title: '简单状态管理示例',
home: MyStaterPage(title: 'Flutter Demo 状态管理页面'),
);
}
}
class MyStaterPage extends StatelessWidget {
const MyStaterPage({super.key, required this.title});
final String title;
static int _counter = 0;
[@override](/user/override)
Widget build(BuildContext context) {
return Stater<StateManager>(
builder: (stater) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'你已经按下了按钮这么多次:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
_counter++;
stater.invalidate();
},
tooltip: '增加',
child: const Icon(Icons.add),
), // 这个逗号使得构建方法更美观
);
}
);
}
}
让我们将计数器状态处理逻辑提取到一个单独的类 CounterState
中。
class MyStaterPage extends StatelessWidget {
const MyStaterPage({super.key, required this.title});
final String title;
[@override](/user/override)
Widget build(BuildContext context) {
return Stater(
manager: () => CounterState(),
builder: (stater) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
const Text(
'你已经按下了按钮这么多次:',
),
Text(
'${stater.counter}',
style: Theme.of(context).textTheme.headline4,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: () => stater.counter++,
tooltip: '增加',
child: const Icon(Icons.add),
), // 这个逗号使得构建方法更美观
);
}
);
}
}
class CounterState extends StateManager {
int _counter = 0;
int get counter => _counter;
set counter(int value) {
if (_counter == value) return;
_counter = value;
invalidate();
}
}
现在所有的计数器状态管理逻辑都可以在单独的 CounterState
类中完成。
例如,我们可以添加模拟从服务器获取响应的延迟。
class CounterState extends StateManager {
int _counter = 0;
int get counter => _counter;
set counter(int value) {
if (_counter == value) return;
Future.delayed(const Duration(seconds: 1), () {
_counter = value;
invalidate();
});
}
}
现在我们可以扩展并添加更多选项来控制计数器状态逻辑。
完整示例代码
import 'package:flutter/material.dart';
import 'package:state_mgr/state_mgr.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: '状态管理演示',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyStaterPage(title: '状态管理演示页面'),
);
}
}
class MyStaterPage extends StatelessWidget {
final String title;
const MyStaterPage({super.key, required this.title});
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Stater(manager: () => CounterState('能量')),
Stater(manager: () => CounterState('健康')),
Stater(manager: () => CounterState('伤害')),
],
),
);
}
}
class CounterState extends StateManager {
String label;
CounterState(this.label);
int _value = 0;
int get value => _value;
set value(int value) {
if (value < 0) value = 0;
if (_value == value) return;
_value = value;
invalidate();
}
void dec() => value--;
void inc() => value++;
[@override](/user/override)
Widget build() {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'$label: $value',
style: Theme.of(context).textTheme.headline4,
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
OutlinedButton(
style: OutlinedButton.styleFrom(backgroundColor: Colors.red.shade100),
onPressed: value > 0 ? dec : null,
child: const Icon(Icons.keyboard_arrow_left)),
const SizedBox(width: 5),
OutlinedButton(
style: OutlinedButton.styleFrom(backgroundColor: Colors.green.shade100),
onPressed: inc,
child: const Icon(Icons.keyboard_arrow_right)),
],
)
],
);
}
}
更多关于Flutter状态管理插件state_mgr的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态管理插件state_mgr的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
state_mgr
是一个轻量级的 Flutter 状态管理插件,它通过使用 ValueNotifier
和 ValueListenableBuilder
来管理应用的状态。它提供了一种简单的方式来管理应用程序的状态,并且可以避免使用复杂的依赖注入或全局状态管理解决方案。
安装
首先,你需要在 pubspec.yaml
文件中添加 state_mgr
依赖:
dependencies:
flutter:
sdk: flutter
state_mgr: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
基本用法
state_mgr
的核心是 StateMgr
类,它允许你创建一个状态管理器,并通过 ValueNotifier
来管理状态。
1. 创建状态管理器
import 'package:state_mgr/state_mgr.dart';
final counterState = StateMgr<int>(0);
这里我们创建了一个 StateMgr
实例,初始值为 0
。
2. 使用 ValueListenableBuilder
监听状态变化
import 'package:flutter/material.dart';
import 'package:state_mgr/state_mgr.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CounterScreen(),
);
}
}
class CounterScreen extends StatelessWidget {
final counterState = StateMgr<int>(0);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Counter Example')),
body: Center(
child: ValueListenableBuilder<int>(
valueListenable: counterState,
builder: (context, value, child) {
return Text('Counter: $value');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
counterState.value++; // 更新状态
},
child: Icon(Icons.add),
),
);
}
}
在这个例子中,我们使用 ValueListenableBuilder
来监听 counterState
的变化,并在状态变化时更新 UI。
3. 更新状态
你可以通过直接修改 StateMgr
的 value
属性来更新状态:
counterState.value++; // 增加计数器
4. 组合多个状态
你可以使用 StateMgr
来管理多个状态,并通过 ValueListenableBuilder
来监听多个状态的变化。
final counterState = StateMgr<int>(0);
final textState = StateMgr<String>('Hello');
ValueListenableBuilder(
valueListenable: counterState,
builder: (context, counterValue, child) {
return ValueListenableBuilder(
valueListenable: textState,
builder: (context, textValue, child) {
return Column(
children: [
Text('Counter: $counterValue'),
Text('Text: $textValue'),
],
);
},
);
},
);
高级用法
1. 使用 StateMgr
进行依赖注入
你可以在应用程序的顶层创建 StateMgr
实例,并将其传递给需要访问状态的组件。
class MyApp extends StatelessWidget {
final counterState = StateMgr<int>(0);
@override
Widget build(BuildContext context) {
return MaterialApp(
home: CounterScreen(counterState: counterState),
);
}
}
class CounterScreen extends StatelessWidget {
final StateMgr<int> counterState;
CounterScreen({required this.counterState});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Counter Example')),
body: Center(
child: ValueListenableBuilder<int>(
valueListenable: counterState,
builder: (context, value, child) {
return Text('Counter: $value');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
counterState.value++; // 更新状态
},
child: Icon(Icons.add),
),
);
}
}
2. 使用 StateMgr
进行状态持久化
你可以将 StateMgr
与 SharedPreferences
或其他持久化解决方案结合使用,以便在应用程序重启时保持状态。
import 'package:shared_preferences/shared_preferences.dart';
final counterState = StateMgr<int>(0);
void loadCounter() async {
final prefs = await SharedPreferences.getInstance();
counterState.value = prefs.getInt('counter') ?? 0;
}
void saveCounter() async {
final prefs = await SharedPreferences.getInstance();
prefs.setInt('counter', counterState.value);
}