Riverpod
是 Flutter 社区中一个强大且灵活的状态管理工具,被称为 Provider
的升级版。它解决了 Provider
的一些局限性,比如类型安全、全局状态管理的灵活性、不依赖 BuildContext
等。Riverpod
的设计理念是简洁、灵活和高性能,适合从小型到大型项目的状态管理需求。
本篇博客将详细分析 Riverpod
的核心原理、常见用法,并结合实际场景进行实战演示,帮助你全面掌握 Riverpod
的使用。
Riverpod
是一个独立的状态管理库,不依赖 BuildContext
。StateProvider
、FutureProvider
、StreamProvider
、NotifierProvider
等)。Provider
或其他状态类声明状态。ProviderScope
提供状态。ref.watch
或 ref.read
获取状态并更新 UI。Provider
:
StateProvider
:
FutureProvider
:
StreamProvider
:
NotifierProvider
:
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// 定义状态
final counterProvider = StateProvider<int>((ref) => 0);
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: CounterHomePage(),
);
}
}
class CounterHomePage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final counter = ref.watch(counterProvider); // 监听状态
return Scaffold(
appBar: AppBar(title: Text("Riverpod 示例")),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("点击次数:$counter"),
ElevatedButton(
onPressed: () => ref.read(counterProvider.notifier).state++,
child: Text("增加计数"),
),
],
),
),
);
}
}
StateProvider
声明可变状态。ref.watch
监听状态变化。ref.read
修改状态。import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// 定义异步状态
final dataProvider = FutureProvider<String>((ref) async {
await Future.delayed(Duration(seconds: 2)); // 模拟网络请求
return "数据加载完成";
});
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: DataPage(),
);
}
}
class DataPage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final data = ref.watch(dataProvider); // 监听异步状态
return Scaffold(
appBar: AppBar(title: Text("异步状态示例")),
body: Center(
child: data.when(
data: (value) => Text(value),
loading: () => CircularProgressIndicator(),
error: (err, stack) => Text("加载失败:$err"),
),
),
);
}
}
FutureProvider
:
when
方法:
data
、loading
、error
)渲染不同的 UI。// 商品状态
final productProvider = Provider<List<String>>((ref) {
return ["商品 1", "商品 2", "商品 3"];
});
// 购物车状态
final cartProvider = StateProvider<List<String>>((ref) => []);
class ProductListPage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final products = ref.watch(productProvider); // 获取商品列表
final cart = ref.watch(cartProvider); // 获取购物车状态
return Scaffold(
appBar: AppBar(
title: Text("商品列表"),
actions: [
IconButton(
icon: Icon(Icons.shopping_cart),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CartPage()),
);
},
),
],
),
body: ListView.builder(
itemCount: products.length,
itemBuilder: (context, index) {
final product = products[index];
return ListTile(
title: Text(product),
trailing: ElevatedButton(
onPressed: () {
ref.read(cartProvider.notifier).state.add(product);
},
child: Text("添加到购物车"),
),
);
},
),
);
}
}
class CartPage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final cart = ref.watch(cartProvider); // 获取购物车状态
return Scaffold(
appBar: AppBar(title: Text("购物车")),
body: ListView.builder(
itemCount: cart.length,
itemBuilder: (context, index) {
final product = cart[index];
return ListTile(
title: Text(product),
trailing: ElevatedButton(
onPressed: () {
ref.read(cartProvider.notifier).state.remove(product);
},
child: Text("删除"),
),
);
},
),
);
}
}
Provider
:
StateProvider
:
NotifierProvider
管理复杂状态// 定义 Notifier
class CounterNotifier extends Notifier<int> {
int build() => 0;
void increment() => state++;
}
// 定义 NotifierProvider
final counterNotifierProvider =
NotifierProvider<CounterNotifier, int>(() => CounterNotifier());
class CounterHomePage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final counter = ref.watch(counterNotifierProvider); // 监听状态
return Scaffold(
appBar: AppBar(title: Text("NotifierProvider 示例")),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text("点击次数:$counter"),
ElevatedButton(
onPressed: () => ref.read(counterNotifierProvider.notifier).increment(),
child: Text("增加计数"),
),
],
),
),
);
}
}
Notifier
:
NotifierProvider
:
Notifier
类型的状态。import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
// 商品状态
final productProvider = Provider<List<Map<String, dynamic>>>((ref) {
return [
{"name": "商品 1", "price": 10.0},
{"name": "商品 2", "price": 20.0},
{"name": "商品 3", "price": 30.0},
];
});
// 购物车状态
final cartProvider = StateProvider<List<Map<String, dynamic>>>((ref) => []);
void main() {
runApp(ProviderScope(child: MyApp()));
}
class MyApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: ProductListPage(),
);
}
}
class ProductListPage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final products = ref.watch(productProvider); // 获取商品列表
final cart = ref.watch(cartProvider); // 获取购物车状态
return Scaffold(
appBar: AppBar(
title: Text("商品列表"),
actions: [
IconButton(
icon: Icon(Icons.shopping_cart),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => CartPage()),
);
},
),
],
),
body: ListView.builder(
itemCount: products.length,
itemBuilder: (context, index) {
final product = products[index];
return ListTile(
title: Text(product["name"]),
subtitle: Text("价格:¥${product["price"]}"),
trailing: ElevatedButton(
onPressed: () {
ref.read(cartProvider.notifier).state.add(product);
},
child: Text("添加到购物车"),
),
);
},
),
);
}
}
class CartPage extends ConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) {
final cart = ref.watch(cartProvider); // 获取购物车状态
return Scaffold(
appBar: AppBar(title: Text("购物车")),
body: ListView.builder(
itemCount: cart.length,
itemBuilder: (context, index) {
final product = cart[index];
return ListTile(
title: Text(product["name"]),
subtitle: Text("价格:¥${product["price"]}"),
trailing: ElevatedButton(
onPressed: () {
ref.read(cartProvider.notifier).state.remove(product);
},
child: Text("删除"),
),
);
},
),
);
}
}
StateProvider
和 FutureProvider
。NotifierProvider
管理复杂状态。NotifierProvider
和依赖注入,构建模块化的状态管理体系。