Flutter扩展功能插件riverpod_community_extensions的使用
Flutter扩展功能插件riverpod_community_extensions的使用
Riverpod Community Extensions 是一组对 Riverpod 中 ref
类型的有用扩展。这些扩展使得与提供商(providers)交互更加灵活和强大,并可以轻松地添加一些常见的功能,例如自动刷新。
特性 🚀
该包为 ref
类型添加了以下方法:
cacheFor
在AutoDisposeRef
上 - 防止提供商在指定时间内被释放。cacheDataFor
在AutoDisposeFutureProviderRef
上 - 保留未来提供商的数据指定时间。debounce
在AutoDisposeFutureProviderRef
上 - 等待指定时间后调用提供商的计算,并取消之前的调用。autoRefresh
在AutoDisposeRef
上 - 按指定间隔刷新值。适用于需要定期更新提供商值的场景。refreshWhenReturningToForeground
在AutoDisposeRef
上 - 当应用程序返回到前台时刷新提供商的值,确保数据始终是最新的。refreshWhenNetworkAvailable
在AutoDisposeFutureProviderRef
上 - 当网络可用时自动刷新具有错误状态的提供商。使用connectivity_plus
包。
安装 💻
要开始使用 Riverpod Community Extensions,必须在您的机器上安装 Dart SDK。
通过 dart pub add
安装:
dart pub add riverpod_community_extensions
使用 🎨
只需导入包并使用提供的扩展方法即可。
示例代码(无代码生成)
import 'package:riverpod_community_extensions/riverpod_community_extensions.dart';
import 'package:riverpod/riverpod.dart';
final dataProvider = FutureProvider.autoDispose((ref) async {
ref.cacheDataFor(const Duration(minutes: 5));
return fetchData();
});
示例代码(有代码生成)
import 'package:riverpod_community_extensions/riverpod_community_extensions.dart';
import 'package:riverpod/riverpod.dart';
part 'data_provider.g.dart';
[@riverpod](/user/riverpod)
Future<int> data(DataRef ref) async {
ref.cacheDataFor(const Duration(minutes: 5));
return fetchData();
}
示例代码
以下是完整的示例代码,展示了如何使用 cacheDataFor
扩展方法。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:riverpod_community_extensions/riverpod_community_extensions.dart';
part 'main.g.dart';
[@riverpod](/user/riverpod)
Future<int> cacheDataFor(CacheDataForRef ref) async {
ref.cacheDataFor(const Duration(seconds: 4));
await Future.delayed(const Duration(seconds: 3));
return 42;
}
void main() {
runApp(
const ProviderScope(
child: MaterialApp(
home: HomeScreen(),
),
),
);
}
class HomeScreen extends ConsumerStatefulWidget {
const HomeScreen({
super.key,
});
[@override](/user/override)
ConsumerState<ConsumerStatefulWidget> createState() {
return _HomeScreenState();
}
}
class _HomeScreenState extends ConsumerState<HomeScreen> {
[@override](/user/override)
Widget build(BuildContext context) {
// ignore: avoid-ref-read-inside-build , this is a demonstration for a side effect
var data = ref.read(cacheDataForProvider.future);
return Scaffold(
body: SafeArea(
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(
'Gets mock data. After 3 seconds, it returns 42, '
'and then cache the result for 4 seconds.',
),
const Divider(indent: 20, endIndent: 20),
Row(
mainAxisSize: MainAxisSize.min,
children: [
ElevatedButton(
child: const Text(
'get data once again',
),
onPressed: () {
setState(() {
data = ref.read(cacheDataForProvider.future);
});
},
),
const SizedBox(width: 10),
Padding(
padding: const EdgeInsets.all(8),
child: FutureBuilder(
future: data,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
final snapshotData = snapshot.data;
if (snapshotData == null) {
return const Text('no data');
}
return Text('data: $snapshotData');
}
return const CircularProgressIndicator();
},
),
),
],
),
],
),
),
),
);
}
}
更多关于Flutter扩展功能插件riverpod_community_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter扩展功能插件riverpod_community_extensions的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用riverpod_community_extensions
插件的示例代码。riverpod_community_extensions
为Riverpod状态管理库提供了一些扩展功能,例如监听器、缓存等。
步骤 1: 添加依赖
首先,在你的pubspec.yaml
文件中添加riverpod
和riverpod_community_extensions
的依赖:
dependencies:
flutter:
sdk: flutter
riverpod: ^x.x.x # 请替换为最新版本号
riverpod_community_extensions: ^x.x.x # 请替换为最新版本号
然后运行flutter pub get
来安装这些依赖。
步骤 2: 创建一个Riverpod Provider
接下来,让我们创建一个简单的Riverpod Provider,并使用riverpod_community_extensions
提供的一些功能。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_community_extensions/riverpod_community_extensions.dart';
final counterProvider = StateNotifierProvider<CounterNotifier, int>((ref) {
return CounterNotifier();
});
class CounterNotifier extends StateNotifier<int> {
CounterNotifier() : super(0);
void increment() {
state++;
}
}
步骤 3: 使用扩展功能
使用监听器 (Listener)
riverpod_community_extensions
提供了autoDisposeListener
等扩展功能,可以方便地监听Provider的变化。
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod_community_extensions/riverpod_community_extensions.dart';
void main() {
runApp(
ProviderScope(
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Riverpod Community Extensions Demo')),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text('You have pushed the button this many times:'),
Consumer(builder: (context, ref, _) {
final count = ref.watch(counterProvider);
return Text(
'$count',
style: Theme.of(context).textTheme.headline4,
);
}),
ElevatedButton(
onPressed: () => ref.read(counterProvider.notifier).increment(),
child: Text('Increment'),
),
],
),
),
),
);
}
}
// 在某个Widget中使用autoDisposeListener监听counterProvider
class CounterListenerWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
ref.autoDisposeListener<int>(counterProvider, (previous, next) {
print('Counter changed from $previous to $next');
});
return Container(); // 可以返回任何Widget
}
}
在上面的代码中,autoDisposeListener
用于监听counterProvider
的变化,并在变化时打印日志。注意,autoDisposeListener
会自动在Widget被销毁时取消监听,避免内存泄漏。
使用缓存 (Cache)
虽然riverpod_community_extensions
本身不直接提供缓存Provider,但你可以结合其他库(如riverpod_cached_provider
)来实现缓存功能。不过,这里仅展示如何通过扩展功能实现自定义逻辑,例如模拟一个简单的缓存。
// 假设我们有一个API调用,我们希望通过Provider缓存结果
final apiResultProvider = StateProvider<String?>((ref) {
// 模拟从缓存中获取数据(实际项目中可能从SharedPreferences或内存中获取)
final cachedData = 'cached_data'; // 这里是模拟数据
if (cachedData != null) {
return cachedData;
}
// 模拟API调用并返回数据(这里直接返回新数据)
return 'api_data';
});
// 使用ConsumerWidget来消费Provider
class ApiResultWidget extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final apiResult = ref.watch(apiResultProvider);
return Text('API Result: $apiResult');
}
}
请注意,上面的代码只是一个非常简单的示例,并没有真正实现缓存机制。在实际项目中,你可能需要使用更复杂的逻辑来管理缓存,例如设置缓存有效期、更新缓存数据等。
通过这些示例代码,你可以看到如何在Flutter项目中使用riverpod_community_extensions
插件来扩展Riverpod的功能。根据你的具体需求,你可以进一步探索该插件提供的其他扩展功能。