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

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

相关推荐
kirk_wang20 小时前
Flutter 导航锁踩坑实录:从断言失败到类型转换异常
前端·javascript·flutter
往来凡尘1 天前
Flutter运行iOS26真机的两个问题
flutter·ios
yfmingo1 天前
flutter项目大量使用.obs会导致项目性能极度下降吗
flutter
山璞1 天前
Flutter3.32 中使用 webview4.13 与 vue3 项目的 h5 页面通信,以及如何调试
前端·flutter
ezeroyoung1 天前
环信em_chat_uikit(Flutter)适配鸿蒙
flutter·华为·harmonyos
恋猫de小郭1 天前
再次紧急修复,Flutter 针对 WebView 无法点击问题增加新的快速修复
android·前端·flutter
庄雨山1 天前
Flutter+Riverpod+开源鸿蒙:新一代跨端状态管理实战
flutter·开源·openharmonyos
遝靑1 天前
深入 Flutter 底层:自定义 RenderObject 实现高性能异形列表项
flutter