深色模式
riverpod
Flutter的状态管理,官方首推provider和flutter_riverpod。
这两个库,出自同一作者,flutter_riverpod
是provider
的升级版。
另外,flutter_hooks
也出自该作者,flutter_riverpod
结合flutter_hooks
使用,就是hooks_riverpod
。
安装hooks_riverpod
sh
# hooks
flutter pub add flutter_hooks
# riverpod
flutter pub add hooks_riverpod
flutter pub add riverpod_annotation
flutter pub add dev:riverpod_generator
flutter pub add dev:riverpod_lint
使用
2种定义形式:Provider、Notifier
状态可以定义为2种形式:Provider形式、Notifier形式。状态的处理,又分同步处理和异步处理。
同步Provider:
dart
@riverpod
int count(CountRef ref) {
return 1;
}
异步Provider:
dart
@riverpod
Future<int> total(TotalRef ref) async {
return Future.value(10);
}
同步Notifier:
dart
@riverpod
class UserName extends _$UserName {
@override
String build() {
return "Jack";
}
}
异步Notifier:
dart
@riverpod
class UserLevel extends _$UserLevel {
@override
FutureOr<int> build() async {
return Future.value(5);
}
}
订阅一个状态
改变状态
添加参数
对于Provider,在ref后面添加参数:
dart
@riverpod
int count(CountRef ref, int p1, {String? p2}) {
return 1;
}
手动修改状态
在Provider中,可以通过state
属性,访问当前状态,改变state
的值,状态立即生效,并通知所有订阅者。
手动改变同步Provider中的状态
改变state
时,要替换整个state
,而不是修改state中的属性。
dart
state = userInfo;
如果不想替换整个state
,必须使用ref.notifyListeners()
通知当前的订阅者。否则,修改不会反映到UI上。
dart
state.value = userInfo;
ref.notifyListeners();
手动改变异步Provider中的状态
dart
state = AsyncData(userInfo);
异步Provider,先等待当前状态完成
手动改变异步Provider时,当前状态可能处于loaing中,可以通过当前Provider的future
属性,等待当前状态完成,再赋值一个新的状态。
dart
await future;
state = AsyncData(userInfo);
keepAlive
默认地,当Provider的最后一个订阅者dispose时,Provider中的状态会销毁。
如果要阻止这种默认行为,可以使用keepAlive
:
dart
@Riverpod(keepAlive: true)
int example(ExampleRef ref) {
return 0;
}
在WidgetRef以外读取状态
使用ProviderContainer
dart
LoginBean? loginBean = await ProviderContainer().read(loginInfoProvider.future);