我在Ffltter中使用Riverpod,最近我一直在从StateNotifierProvider迁移到NotifierProvider.作为迁移的一部分,我对Riverpod代码进行了修改,该代码可以监控应用程序的生命周期,并在应用程序的外观模式发生变化时自动更改Ffltter应用程序的主题.我有一个关于这个修改的问题.

修改前:

final sampleProvider =
    StateNotifierProvider<SampleNotifier, SampleState>((ref) {
  final observer = SampleNotifier();
  final binding = WidgetsBinding.instance..addObserver(observer);
  ref.onDispose(() {
    binding.removeObserver(observer);
  });
  return observer;
});

修改后:

final sampleProvider =
    NotifierProvider.autoDispose<SampleNotifier, SampleState>(() {
  final observer = SampleNotifier();
  WidgetsBinding.instance.addObserver(observer);
  //final binding = WidgetsBinding.instance..addObserver(observer);
  // ref.onDispose(() {
  //   binding.removeObserver(observer);
  // });
  return observer;
});

在将StateNotifierProvider修改为NotifierProvider的过程中,我删除了以下部分:

  ref.onDispose(() {
    binding.removeObserver(observer);
  });

可以go 掉这个部件吗?如果观察者无限期地被绑定,会不会对应用程序产生负面影响或造成效率低下?

推荐答案

您似乎删除了处理逻辑,因为您没有访问ref对象的权限.

在新的Notifier类中,您可以在SampleNotifier的Build方法中处理初始化和处置逻辑.

class SampleNotifier extends Notifier<SampleState> with WidgetsBindingObserver{
  @override
  SampleState build() {
    final binding = WidgetsBinding.instance..addObserver(this);
    ref.onDispose(() {
      binding.removeObserver(this);
    });

    return ...;
  }
}

Ios相关问答推荐

与iPadOS中带有扣件的模式相似的组件是什么?

SWIFT AVFoundation翻转相机功能不起作用

检测touch 并忽略其他手势SWIFT SceneKit

磁盘上的Objective-C ISA指针与实例化对象时的比较

分配给指针会通过 class_addMethod 导致 EXC_BAD_ACCESS

为什么applicationState发布者只发布一次?

SwiftUI HStack 文本字段对齐

不可发送类型 '[String : Any]?'在调用非隔离实例方法 XXX 时退出主参与者隔离上下文不能跨越参与者边界

在 Swift 中从 Objective C 集合调用块

SwiftUI:同时拖动父视图和子视图,但手指分开

SwiftUI:如何用拇指移动滑块值

何时需要将应用程序源包含在测试目标中?

从 NSData 或 UIImage 中查找图像类型

SwiftUI NavigationView navigationBarTitle LayoutConstraints 问题

在 iOS 上编写文件

UITableView:从空白部分隐藏标题

如何防止 iOS 设备上的显示屏变暗和关闭?

如何在 iphone 屏幕中间显示活动指示器?

使用 swift 3 在 UIView 上添加阴影

在 NSUserDefaults 中存储值是否有任何限制?