Я пытался использовать провайдер для управления состоянием TextField Controller, и ниже приведен code провайдера, который я использую. Я хочу узнать, почему dispose called! не выводится на консоль, когда я покидаю страницу забытого пароля. Я протестировал метод 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"),
),
],
),
),
),
);
}
}
Ия
Вопрос задан7 июля 2024 г.