我有这个 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);