Flutter状态管理插件very_simple_state_manager的使用
Flutter状态管理插件very_simple_state_manager
的使用
very_simple_state_manager
是一个简单易用的状态管理插件,它结合了Flutter核心组件、BLoC架构、ChangeNotifier
的简洁性和Riverpod的状态感知能力。本文将详细介绍如何使用这个插件,并提供完整的示例代码。
🔍 工作原理
- 简单:易于理解和实现。
- 响应式:UI会随着状态的变化自动更新。
- 干净:逻辑与UI分离,便于代码组织。
- 无依赖:仅依赖于Flutter内置的
ValueNotifier
和ValueListenableBuilder
。
🚀 开始使用
首先,在您的Flutter项目中添加该插件:
flutter pub add very_simple_state_manager
📖 使用方法
1. 创建状态管理器
创建一个简单的计数器管理器:
class CounterManager extends StateManager<int> {
CounterManager() : super(0);
void increment() {
state = state + 1;
}
}
2. 在UI中使用
Option 1: StateBuilder
这是最简单的方式,用于响应状态变化:
class CounterWidget extends StatefulWidget {
[@override](/user/override)
State<CounterWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends State<CounterWidget> {
late final CounterManager _counter;
[@override](/user/override)
void initState() {
super.initState();
_counter = CounterManager();
}
[@override](/user/override)
void dispose() {
_counter.dispose(); // 不要忘记释放状态管理器
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: StateBuilder(
stateManager: _counter,
builder: (context, count) => Center(
child: Text('Count: $count'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: _counter.increment,
child: Icon(Icons.add),
),
);
}
}
Option 2: ManagedWidget
这是一个替代StatelessWidget
的选择,自动在状态变化时重建:
class CounterWidget extends ManagedWidget<CounterManager, int> {
[@override](/user/override)
CounterManager createStateManager() => CounterManager();
[@override](/user/override)
Widget build(BuildContext context, int state) {
return Scaffold(
body: Center(
child: Text('Count: $state'),
),
floatingActionButton: FloatingActionButton(
onPressed: stateManager.increment,
child: Icon(Icons.add),
),
);
}
}
Option 3: ManagedStatefulWidget
当您需要StatefulWidget
的功能并自动在状态变化时重建时:
class CounterWidget extends ManagedStatefulWidget<CounterManager, int> {
const CounterWidget({super.key});
[@override](/user/override)
CounterManager createStateManager() => CounterManager();
[@override](/user/override)
State<CounterWidget> createState() => _CounterWidgetState();
}
class _CounterWidgetState extends ManagedState<CounterManager, int, CounterWidget> {
void _handleIncrement() {
stateManager.increment();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text('Count: $state'),
),
floatingActionButton: FloatingActionButton(
onPressed: _handleIncrement,
child: Icon(Icons.add),
),
);
}
}
Option 4: SelectedStateBuilder
当您只需要基于状态的一部分进行重建时:
class ComplexCounterManager extends StateManager<CounterState> {
ComplexCounterManager() : super(CounterState(count: 0, lastUpdated: DateTime.now()));
void increment() {
state = CounterState(count: state.count + 1, lastUpdated: DateTime.now());
}
}
class CounterWidget extends StatelessWidget {
final ComplexCounterManager _counter = ComplexCounterManager();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Column(
children: [
SelectedStateBuilder(
stateManager: _counter,
selector: (state) => state.count,
builder: (context, count) => Text('Count: $count'),
),
SelectedStateBuilder(
stateManager: _counter,
selector: (state) => state.lastUpdated,
builder: (context, lastUpdated) => Text('Last Updated: $lastUpdated'),
),
],
),
floatingActionButton: FloatingActionButton(
onPressed: _counter.increment,
child: Icon(Icons.add),
),
);
}
}
💪 简单却强大
处理复杂的状态管理也可以保持代码的整洁和可维护性:
class UserManager extends StateManager<UserState> {
UserManager(this._repository) : super(InitialUserState());
final UserRepository _repository;
Future<void> loadUser(String id) async {
state = LoadingUserState();
try {
final user = await _repository.getUserById(id);
state = LoadedUserState(user);
} on Exception catch (e) {
state = ErrorUserState(e);
}
}
void updateName(String newName) {
state = LoadedUserState(state.user.copyWith(name: newName));
}
}
实际示例Demo
下面是一个完整的示例应用,演示如何在实际项目中使用very_simple_state_manager
:
import 'package:flutter/material.dart';
import 'package:very_simple_state_manager/very_simple_state_manager.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Very Simple State Manager Demo',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const HomePage(),
);
}
}
class HomePage extends StatelessWidget {
const HomePage({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return const Scaffold(
body: Center(
child: Text(
'Please run one of the example main files:\n\n'
'- state_builder_main.dart\n'
'- selected_state_builder_main.dart\n'
'- managed_widget_main.dart\n'
'- managed_stateful_widget_main.dart',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 16),
),
),
);
}
}
// 示例中的CounterWidget可以替换为上述任意一种方式
class CounterWidget extends ManagedWidget<CounterManager, int> {
[@override](/user/override)
CounterManager createStateManager() => CounterManager();
[@override](/user/override)
Widget build(BuildContext context, int state) {
return Scaffold(
appBar: AppBar(title: Text('Counter Example')),
body: Center(
child: Text('Count: $state'),
),
floatingActionButton: FloatingActionButton(
onPressed: stateManager.increment,
child: Icon(Icons.add),
),
);
}
}
更多关于Flutter状态管理插件very_simple_state_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态管理插件very_simple_state_manager的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用very_simple_state_manager
插件的一个简单示例。very_simple_state_manager
是一个轻量级的状态管理库,适用于小型到中型的应用。
首先,确保你已经在pubspec.yaml
文件中添加了依赖:
dependencies:
flutter:
sdk: flutter
very_simple_state_manager: ^最新版本号 # 请替换为实际的最新版本号
然后运行flutter pub get
来安装依赖。
接下来,我们将展示如何使用very_simple_state_manager
来管理状态。假设我们有一个简单的计数器应用。
1. 创建一个State类
首先,我们创建一个包含我们应用状态的类。在这个例子中,我们将创建一个包含计数器值的类。
import 'package:very_simple_state_manager/very_simple_state_manager.dart';
class CounterState extends VSState<int> {
CounterState() : super(0); // 初始化计数器的值为0
void increment() {
value = value + 1;
notifyListeners(); // 通知监听器状态已更改
}
}
2. 创建ViewModel
接下来,我们创建一个ViewModel来管理状态。ViewModel通常包含状态实例并提供操作这些状态的方法。
import 'package:very_simple_state_manager/very_simple_state_manager.dart';
class CounterViewModel extends VSViewModel {
final CounterState counterState;
CounterViewModel() : counterState = CounterState();
void incrementCounter() {
counterState.increment();
}
}
3. 在UI中使用ViewModel和状态
现在,我们需要在UI中使用我们的ViewModel和状态。我们将使用VSProvider
来提供ViewModel,并使用VSConsumer
来监听状态的变化。
import 'package:flutter/material.dart';
import 'package:very_simple_state_manager/very_simple_state_manager.dart';
import 'counter_view_model.dart'; // 导入我们之前创建的ViewModel文件
import 'counter_state.dart'; // 导入我们之前创建的状态文件
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return VSProvider<CounterViewModel>(
create: () => CounterViewModel(),
child: MaterialApp(
home: CounterPage(),
),
);
}
}
class CounterPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Counter App'),
),
body: Center(
child: VSConsumer<CounterViewModel>(
builder: (context, viewModel, child) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
'You have pushed the button this many times:',
),
Text(
'${viewModel.counterState.value}',
style: Theme.of(context).textTheme.headline4,
),
],
);
},
updateShouldNotify: (prev, next) => prev.counterState.value != next.counterState.value,
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
VSProvider.of<CounterViewModel>(context).incrementCounter();
},
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
在这个例子中,我们创建了一个简单的计数器应用,使用very_simple_state_manager
来管理状态。CounterState
类包含计数器值并提供增加计数器的方法。CounterViewModel
类管理这个状态。在UI中,我们使用VSProvider
来提供ViewModel,并使用VSConsumer
来监听和显示状态。
这个示例展示了如何使用very_simple_state_manager
来管理应用状态,但实际应用中可能会更复杂。根据需求,你可以扩展这个示例来处理更多的状态和逻辑。