Riverpod3.0.0替换StateProvider和ChangeNotifierProvider

纷纷扰扰几载,常用的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

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

相关推荐
程序员老刘·10 小时前
从短剧App的bug看响应式编程在AI时代的优势
flutter·ai编程·跨平台开发
传奇开心果编程1 天前
【Flutter踩坑排雷】第7课:巨型 build 函数坑|全部 UI 写在同一个 build,维护难、隐性异常
android·flutter·ios·移动开发·跨平台·dart·声明式ui
程序员老刘1 天前
从短剧App的bug看响应式编程在AI时代的优势
flutter·ai编程·客户端
恋猫de小郭1 天前
最近 Android 有什么更新:Android Dev Summit 2026 技术解读
android·前端·flutter
好的佩奇2 天前
Dart 之类修饰符
android·flutter·dart
好的佩奇012 天前
Dart 之类修饰符
android·flutter·dart
Jewel1052 天前
文字为什么总是不居中!记录一个bug
android·flutter·ios
2601_949847753 天前
Form-data 跨端三方库仓颉适配全流程
前端·javascript·flutter
大龄秃头程序员3 天前
Flutter 中我为什么把 GetX 定位为高效率方案,而不是默认架构方案
flutter
传奇开心果编程3 天前
组合优先开发范式:从汉字造字原理到声明式UI组件组合思想
android·flutter·ios·swiftui·移动开发·harmonyos·android jetpack