Riverpod - ref.onDispose 在创建对象时调用,而不是在释放时调用
Riverpod - ref.onDispose called when object is created, and not when disposed
我有这个 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);
访问提供商
I don't need to listen since I don't need to rebuild the page on
change. Is consumer less performant for this?
不,性能是没有意义的,即使它在监听它也不会真正影响性能,因为作为提供者没有办法通知(状态通知器或更改通知器不是这种情况)
此外,如果您不关心在读取值后收听自动处理理解没有人在看它并且它会处理,最好在使用点击或修改某些东西的手势时使用 context.read
我有这个 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);
I don't need to listen since I don't need to rebuild the page on change. Is consumer less performant for this?
不,性能是没有意义的,即使它在监听它也不会真正影响性能,因为作为提供者没有办法通知(状态通知器或更改通知器不是这种情况)
此外,如果您不关心在读取值后收听自动处理理解没有人在看它并且它会处理,最好在使用点击或修改某些东西的手势时使用 context.read