纷纷扰扰几载,常用的API过期,又是一段战火燃烧的年代。
一、StateProvider
和ChangeNotifierProvider
过期
升级到Riverpod3.0后,官方给了迁移说明2.0迁移到3.0,但是看了很多边,都没有说怎么替换。只是说明了
dart
import 'package:hooks_riverpod/legacy.dart';
import 'package:flutter_riverpod/legacy.dart';
import 'package:riverpod/legacy.dart';
引入这几个,又可以开始玩耍了。BUT
等4.0.0来了,是不是还是被迫修改,那还是要动手了啊!
二、使用NotifierProvider
替换
虽然官网没有NotifierProvider
的样例,但是使用后发现,用它来替换StateProvider
和ChangeNotifierProvider
很好用。
dart
// 如果是bool类型的,直接复用
import 'package:flutter_riverpod/flutter_riverpod.dart';
class ProviderBool extends Notifier<bool> {
@override
bool build() => false;
void setValue(bool value) {
state = value;
}
void toggle() {
state = !state;
}
}
class ProviderBoolNull extends Notifier<bool?> {
@override
bool? build() => null;
void setValue(bool? value) {
state = value;
}
}
class ProviderBoolTrue extends Notifier<bool> {
@override
bool build() => true;
void setValue(bool value) {
state = value;
}
}
// 如果是string类型的,直接复用
class ProviderString extends Notifier<String> {
@override
String build() => "";
void setValue(String value) {
state = value;
}
}
class ProviderStringBar extends Notifier<String> {
@override
String build() => "-";
void setValue(String value) {
state = value;
}
}
class ProviderStringNull extends Notifier<String?> {
@override
String? build() => null;
void setValue(String? value) {
state = value;
}
}
// 如果是int类型的,直接复用
class ProviderInt extends Notifier<int> {
@override
int build() => 0;
void setValue(int value) {
state = value;
}
}
class ProviderIntMinusOne extends Notifier<int> {
@override
int build() => -1;
void setValue(int value) {
state = value;
}
}
// 如果是double类型的,直接复用
class ProviderDouble extends Notifier<double> {
@override
double build() => 0.0;
void setValue(double value) {
state = value;
}
}
class ProviderDoubleNull extends Notifier<double?> {
@override
double? build() => null;
void setValue(double? value) {
state = value;
}
}
// 如果是List<int>类型的,直接复用
class ProviderListInt extends Notifier<List<int>> {
@override
List<int> build() => [];
void setValue(List<int> value) {
state = value;
}
}
准备好一些常用的,然后
dart
final pendingBikeDataDataProvider =
NotifierProvider<PendingBikeDataNotifier, PendingBikeDataData?>(PendingBikeDataNotifier.new);
在修改state值的地方使用:
dart
ref.read(pendingBikeDataDataProvider.notifier).setValue(data);
当然也可以是自定义的对象,比如:
dart
class PendingBikeDataNotifier extends Notifier<PendingBikeDataData?> {
@override
PendingBikeDataData? build() => null;
void setValue(PendingBikeDataData? value) {
state = value;
}
}
对ChangeNotifierProvider
也是一样处理。
三、 注意
在使用Notifier
时,需要注意state
对象修改了,才会触发watch
. 推荐使用copyWith()
,然后复制给state,如:
dart
state = state.copyWith(distance: value);
DONE
初步修改,有更好的使用样例,请赐教。