0

我有这个 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 行。

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

编辑:我访问提供者final viewModel = context.read<SignInViewModel>(signInViewModelProvider);

4

1 回答 1

1

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

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

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

于 2020-12-07T19:26:12.513 回答