Riverpod3.0.0替换StateProvider和ChangeNotifierProvider

纷纷扰扰几载,常用的API过期,又是一段战火燃烧的年代。

一、StateProviderChangeNotifierProvider过期

升级到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的样例,但是使用后发现,用它来替换StateProviderChangeNotifierProvider很好用。

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

初步修改,有更好的使用样例,请赐教。

相关推荐
子春一3 小时前
Flutter for OpenHarmony:形状拼图:基于路径几何与空间吸附的交互式拼图系统架构解析
flutter·系统架构
ujainu12 小时前
Flutter + OpenHarmony 游戏开发进阶:用户输入响应——GestureDetector 实现点击发射
flutter·游戏·openharmony
hudawei99613 小时前
TweenAnimationBuilder和AnimatedBuilder两种动画的比较
flutter·ui·动画·tweenanimation·animatedbuilder
ujainu13 小时前
Flutter + OpenHarmony 实现无限跑酷游戏开发实战—— 对象池化、性能优化与流畅控制
flutter·游戏·性能优化·openharmony·endless runner
ZH154558913114 小时前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
晚烛15 小时前
CANN + 物理信息神经网络(PINNs):求解偏微分方程的新范式
javascript·人工智能·flutter·html·零售
一起养小猫16 小时前
Flutter for OpenHarmony 实战:扫雷游戏完整开发指南
flutter·harmonyos
晚烛16 小时前
CANN 赋能智慧医疗:构建合规、高效、可靠的医学影像 AI 推理系统
人工智能·flutter·零售
晚霞的不甘16 小时前
揭秘 CANN 内存管理:如何让大模型在小设备上“轻装上阵”?
前端·数据库·经验分享·flutter·3d
小哥Mark18 小时前
Flutter开发鸿蒙年味 + 实用实战应用|绿色烟花:电子烟花 + 手持烟花
flutter·华为·harmonyos