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

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

相关推荐
小白学鸿蒙5 小时前
使用Flutter从0到1构建OpenHarmony/HarmonyOS应用
flutter·华为·harmonyos
不爱吃糖的程序媛7 小时前
Flutter OH 框架介绍
flutter
ljt27249606618 小时前
Flutter笔记--加水印
笔记·flutter
恋猫de小郭10 小时前
2026,Android Compose 终于支持 Hot Reload 了,但是收费
android·前端·flutter
ljt27249606611 天前
Flutter笔记--事件处理
笔记·flutter
Feng-licong1 天前
告别手写 UI:当 Google Stitch 遇上 Flutter,2026 年的“Vibe Coding”开发流
flutter·ui
不爱吃糖的程序媛2 天前
Flutter OH Engine构建指导
flutter
小蜜蜂嗡嗡2 天前
flutter实现付费解锁内容的遮挡
android·flutter
tangweiguo030519872 天前
Flutter iOS 调试利器:idevicesyslog 从入门到精通
flutter
tangweiguo030519872 天前
Flutter 异常捕获与处理:从入门到生产实践
flutter