【发布时间】: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<SignInViewModel>(signInViewModelProvider); 访问提供程序
【问题讨论】:
-
在页面中读取的提供者究竟是怎样的?
-
@EdwynZN 刚刚添加到问题的底部,谢谢
-
使用消费者或消费者小部件,context.read 不会让提供者保持活动状态,只需读取一次就可以了,消费者保持监听直到小部件被释放(Navigator.pop)
-
@EdwynZN 谢谢。今晚会做。只是想知道,我不需要听,因为我不需要在更改时重建页面。消费者对此的表现是否较差?