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

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

相关推荐
Flutter OH6 小时前
Flutter OH 外接纹理问题定位指南
flutter
未来猫咪花11 小时前
Everything is ViewModel:让状态管理回到对象世界
android·flutter·ios
Flutter OH12 小时前
Flutter OH 日志抓取与过滤指南
flutter
Flutter OH12 小时前
Flutter OH 内存与 GPU 问题定位指南
flutter
Flutter OH13 小时前
Flutter OH 多设备适配问题定位指南
flutter
律宏阔14 小时前
Flutter Hooks 与 flutter_map_animations 冲突:第二次地图动画报错的解决方案
flutter
Flutter OH18 小时前
Flutter OH 卡死冻屏问题定位指南
flutter·命令模式
2501_9160074718 小时前
Flutter与游戏App加固避坑指南:如何为混合开发与高交互应用选对安全方案?
安全·flutter·游戏·ios·小程序·uni-app·iphone
恋猫de小郭19 小时前
Flutter A2UI 深度解析,它是怎么提供动态生产力的,然后为什么 A2UI 不只是 Flutter
android·前端·flutter