Flutter状态管理插件wrap_riverpod的使用
Flutter状态管理插件wrap_riverpod的使用
Wrap_Riverpod
基于riverpod,在Provider的使用上做了一层包装。
Source
river_pod基础操作
https://pub.dev/packages/flutter_riverpod
// 定义一个StateNotifierProvider
final counterProvider = StateNotifierProvider((ref) {
return Counter(); // 创建Counter实例
});
// Counter类实现StateNotifier
class Counter extends StateNotifier<int> {
Counter() : super(0); // 初始化状态为0
void increment() => state++; // 修改状态的方法
}
// 使用Consumer来监听并展示状态
class Example extends ConsumerWidget {
[@override](/user/override)
Widget build(BuildContext context, WidgetRef ref) {
final count = ref.watch(counterProvider); // 监听counterProvider的状态
return Text(count.toString()); // 展示状态值
}
}
Usage
特性
- StateProvider 可全局定义,层级跨度大的组件仍可通过同一个Provider驱动所依赖到的所有组件进行更新;
- ViewModel 提供一层包装,内部实现StateProvider。
示例代码
以下是一个完整的示例,展示如何使用wrap_riverpod
来管理状态。
引入包
首先确保你已经添加了wrap_riverpod
依赖到你的pubspec.yaml
文件中:
dependencies:
wrap_riverpod: ^版本号
然后运行flutter pub get
安装依赖。
示例代码
import 'package:flutter/material.dart';
import 'package:wrap_riverpod/wrap_riverpod.dart'; // 引入wrap_riverpod
// 定义一个ViewModel类,继承自ViewModel<T>
class TestViewModel extends ViewModel<int> {
TestViewModel(int model) : super(model); // 初始化状态
void increment() {
model++; // 修改状态
}
int get num => model; // 获取当前状态
}
// 使用StatefulWidget来管理ViewModel
class TestViewModelWidgetState extends StatefulWidget {
[@override](/user/override)
_TestViewModelWidgetState createState() => _TestViewModelWidgetState();
}
class _TestViewModelWidgetState extends State<TestViewModelWidgetState> {
final viewModel = TestViewModel(0); // 创建ViewModel实例
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Wrap_Riverpod 示例'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// 使用Consumer来监听ViewModel的状态变化
Consumer(
builder: (context, ref, child) => CupertinoButton.filled(
onPressed: () {
viewModel[ref] = viewModel.increment(); // 更新状态
print('TestViewModelWidgetState.build ${viewModel[ref]}');
},
child: Container(
width: 120,
height: 40,
child: Text('Increment ${viewModel[ref]}'), // 显示当前状态
),
),
),
],
),
),
);
}
}
更多关于Flutter状态管理插件wrap_riverpod的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter状态管理插件wrap_riverpod的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
wrap_riverpod
是一个基于 Riverpod
的状态管理插件,它提供了一种更简洁、更灵活的方式来管理 Flutter 应用中的状态。Riverpod
是 Provider
的改进版本,提供了更好的类型安全性和更灵活的依赖注入机制。
安装 wrap_riverpod
首先,你需要在 pubspec.yaml
文件中添加 wrap_riverpod
依赖:
dependencies:
flutter:
sdk: flutter
wrap_riverpod: ^1.0.0
然后运行 flutter pub get
来安装依赖。
基本用法
1. 创建 Provider
Riverpod
使用 Provider
来管理状态。你可以创建一个 Provider
来提供某个状态或服务。
import 'package:wrap_riverpod/wrap_riverpod.dart';
final counterProvider = StateProvider<int>((ref) => 0);
2. 在 Widget 中使用 Provider
你可以使用 ConsumerWidget
或 Consumer
来访问 Provider
中的状态。
import 'package:flutter/material.dart';
import 'package:wrap_riverpod/wrap_riverpod.dart';
class CounterApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: Consumer(
builder: (context, watch, child) {
final counter = watch(counterProvider).state;
return Text('Count: $counter');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read(counterProvider).state++;
},
child: Icon(Icons.add),
),
),
);
}
}
3. 使用 ProviderScope
包裹应用
为了让 Riverpod
正常工作,你需要在应用的根节点使用 ProviderScope
包裹。
import 'package:flutter/material.dart';
import 'package:wrap_riverpod/wrap_riverpod.dart';
void main() {
runApp(
ProviderScope(
child: CounterApp(),
),
);
}
高级用法
1. 使用 StateNotifierProvider
StateNotifierProvider
用于管理更复杂的状态逻辑。你可以创建一个 StateNotifier
类来封装状态和业务逻辑。
import 'package:wrap_riverpod/wrap_riverpod.dart';
class CounterNotifier extends StateNotifier<int> {
CounterNotifier() : super(0);
void increment() => state++;
}
final counterNotifierProvider = StateNotifierProvider<CounterNotifier>((ref) => CounterNotifier());
然后在 Widget 中使用:
class CounterApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Counter App')),
body: Center(
child: Consumer(
builder: (context, watch, child) {
final counter = watch(counterNotifierProvider).state;
return Text('Count: $counter');
},
),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
context.read(counterNotifierProvider.notifier).increment();
},
child: Icon(Icons.add),
),
),
);
}
}
2. 使用 FutureProvider
和 StreamProvider
FutureProvider
和 StreamProvider
用于处理异步数据。
final futureProvider = FutureProvider<String>((ref) async {
await Future.delayed(Duration(seconds: 2));
return 'Hello, Future!';
});
final streamProvider = StreamProvider<int>((ref) {
return Stream.periodic(Duration(seconds: 1), (i) => i);
});
在 Widget 中使用:
class AsyncDataApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Async Data App')),
body: Center(
child: Consumer(
builder: (context, watch, child) {
final future = watch(futureProvider);
final stream = watch(streamProvider);
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
future.when(
data: (data) => Text('Future: $data'),
loading: () => CircularProgressIndicator(),
error: (error, stack) => Text('Error: $error'),
),
stream.when(
data: (data) => Text('Stream: $data'),
loading: () => CircularProgressIndicator(),
error: (error, stack) => Text('Error: $error'),
),
],
);
},
),
),
),
);
}
}