我试图使用提供程序来管理 TextField 控制器的状态,下面是我正在使用的提供程序的代码。我想知道为什么当我离开忘记密码页面时, dispose 被调用! 没有被打印到控制台。我测试了有状态小部件的处置方法,它按预期工作正常。
// Forgot password page provider
import 'package:flutter/material.dart';
class ForgotPasswordPageProvider with ChangeNotifier {
final TextEditingController _textEditingController = TextEditingController();
final _formKey = GlobalKey<FormState>();
TextEditingController get textEditingController => _textEditingController;
GlobalKey<FormState> get formKey => _formKey;
@override
void dispose() {
_textEditingController.dispose();
print("dispose called!");
super.dispose();
}
}
// Forgot password page
import 'package:chat_app/providers/forgot_password_page_provider.dart';
import 'package:chat_app/utils/form_validator.dart';
import 'package:chat_app/widgets/custom_app_bar.dart';
import 'package:chat_app/widgets/form_input_field.dart';
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart';
class ForgotPasswordPage extends StatelessWidget {
const ForgotPasswordPage({super.key});
@override
Widget build(BuildContext context) {
final provider = Provider.of<ForgotPasswordPageProvider>(context);
return Scaffold(
appBar: CustomAppBar(
leading: IconButton(
onPressed: () {
GoRouter.of(context).pop();
},
icon: const FaIcon(FontAwesomeIcons.xmark),
),
title: "Reset password",
),
body: Padding(
padding: EdgeInsets.symmetric(
horizontal: 24,
vertical: MediaQuery.of(context).size.height * 0.06),
child: Form(
key: provider.formKey,
child: Column(
children: [
Hero(
tag: "logo",
child: FaIcon(
FontAwesomeIcons.comments,
color: Theme.of(context).colorScheme.primary,
size: 96,
),
),
SizedBox(height: MediaQuery.of(context).size.height * 0.02),
FormInputField(
controller: provider.textEditingController,
hintText: "Enter your email address",
keyboardType: TextInputType.emailAddress,
textInputAction: TextInputAction.done,
validator: FormValidator.emailValidator,
label: "E-mail",
),
SizedBox(height: MediaQuery.of(context).size.height * 0.02),
FilledButton(
onPressed: () {
if (provider.formKey.currentState!.validate()) {}
},
child: Text("Reset password"),
),
],
),
),
),
);
}
}
尝试使用
extend
ChangeNotifier 而不是与 modifier
一起使用
class AddonViewModel extends ChangeNotifier {
/// CONSTRUCTOR
AddonViewModel();
@override
void dispose() {
super.dispose();
try {
paymentFinishedWebViewClosedSubscription?.cancel();
} on Exception catch (_) {}
}
}
这应该有效。