【问题标题】:Riverpod - ref.onDispose called when object is created, and not when disposedRiverpod - ref.onDispose 在创建对象时调用,而不是在释放时调用
【发布时间】:2021-03-18 11:28:54
【问题描述】:

我有这个 ViewModel 和一个 Riverpod 提供者:

final signInViewModelProvider = Provider.autoDispose<SignInViewModel>((ref) {
  final vm = SignInViewModel();

  ref.onDispose(() {
    vm.cleanUp();
  });

  return vm;
});

class SignInViewModel extends VpViewModelNew {
  FormGroup get form => _form;
  String get emailKey => _emailKey;
  String get passwordKey => _passwordKey;

  final String _emailKey = UserSignInFieldKeys.email;
  final String _passwordKey = UserSignInFieldKeys.password;

  final FormGroup _form = FormGroup({
    UserSignInFieldKeys.email:
        FormControl<String>(validators: [Validators.required]),
    UserSignInFieldKeys.password:
        FormControl<String>(validators: [Validators.required])
  });

  void cleanUp() {
    print('cleaning up');
  }

  void onSubmitPressed(BuildContext context) {
    // _saveRegistrationLocallyUseCase.invoke(
    // form.control(_self.emailKey).value as String ?? '',
    // form.control(_self.passwordKey).value as String ?? '');
  }
}

abstract class VpViewModelNew {
  VpViewModelNew() {
    if (onCreate != null) {
      onCreate();
      print('creating');
    }
  }

  void onCreate() {}
}

当我导航到具有signInViewModelProvider 的页面时,它会打印到控制台:

flutter: signInPage building
flutter: creating
flutter: cleaning up

然后从堆栈中弹出带有Navigator.pop() 的页面不会打印任何内容。

然后再次导航到该页面以相同的顺序打印相同的 3 行。

我希望在Navigator.pop() 之后调用onDispose,而不是在导航到读取提供程序的页面时调用。为什么在创建后直接调用onDispose,而不是在使用Navigator.pop() 时(因为没有其他视图引用它,我希望提供者被丢弃)?

编辑:我使用 final viewModel = context.read&lt;SignInViewModel&gt;(signInViewModelProvider); 访问提供程序

【问题讨论】:

  • 在页面中读取的提供者究竟是怎样的?
  • @EdwynZN 刚刚添加到问题的底部,谢谢
  • 使用消费者或消费者小部件,context.read 不会让提供者保持活动状态,只需读取一次就可以了,消费者保持监听直到小部件被释放(Navigator.pop)
  • @EdwynZN 谢谢。今晚会做。只是想知道,我不需要听,因为我不需要在更改时重建页面。消费者对此的表现是否较差?

标签: flutter riverpod


【解决方案1】:

我不需要听,因为我不需要重建页面 改变。消费者对此的表现是否较差?

不,性能是没有意义的,即使它正在监听它也不会真正影响性能,因为作为提供者没有办法通知(状态通知器或更改通知器不是这种情况)

此外,如果您在读取值后不想听自动处置了解没有人在看它并处置,最好在使用修改某些内容的点击或手势时使用 context.read

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 2012-10-04
    • 2021-03-23
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    相关资源
    最近更新 更多