[эта часть добавлена после решения: эта проблема возникла у меня, потому что pin_code_fields контроллер пакета, и я добавил эту часть, надеюсь помочь людям с той же проблемой]
Проблема возникает, когда я перехожу к VerifyCodeView и хочу вернуться к ForgotPasswordView, чтобы изменить свой адрес электронной почты.
Когда я пытаюсь ввести любое электронное письмо в поле текстовой формы, появляется следующее сообщение: «Контроллер редактирования текста был использован после удаления».
Я использую пакет pin_code_fields на VerifyCodeView (это вызвало эту проблему?!)
import 'dart:async';
import 'package:conditional_builder_null_safety/conditional_builder_null_safety.dart';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_svg/svg.dart';
import 'package:graduation_project/constants.dart';
import 'package:graduation_project/cubits/bottom_nav_bar_cubit/bottom_nav_bar_cubit.dart';
import 'package:graduation_project/cubits/forgot_password_cubit/forgot_password_cubit.dart';
import 'package:graduation_project/cubits/register_cubit/register_cubit.dart';
import 'package:graduation_project/helper/show_toast_message.dart';
import 'package:graduation_project/local/cache_helper.dart';
import 'package:graduation_project/views/app_view.dart';
import 'package:graduation_project/views/reset_password_view.dart';
import 'package:graduation_project/widgets/custom_text_button.dart';
import 'package:pin_code_fields/pin_code_fields.dart';
class VerifyCodeView extends StatelessWidget {
const VerifyCodeView({super.key, required this.email, this.isRegister = false});
final String email;
final bool isRegister;
static TextEditingController codeController = TextEditingController();
@override
Widget build(BuildContext context) {
return MultiBlocProvider(
providers: [
BlocProvider(create: (context) => ForgotPasswordCubit()),
BlocProvider(create: (context) => RegisterCubit()),
],
child: BlocConsumer<ForgotPasswordCubit, ForgotPasswordState>(
listener: (context, state) {
if (state is ForgotPasswordReceiveCodeSuccessState){
Navigator.pushReplacement(context, MaterialPageRoute(builder: (context){
return ResetPasswordView(
email: email,
resetCode: codeController.text,
);
}));
}
if (state is ForgotPasswordReceiveCodeFailureState){
showToastMessage(
context,
message: state.errorMessage,
state: ToastStates.ERROR,
);
}
},
builder: (context, state) {
var forgotPasswordCubit = BlocProvider.of<ForgotPasswordCubit>(context);
return BlocConsumer<RegisterCubit, RegisterState>(
listener: (context, state) {
if (state is RegisterSuccessState){
BlocProvider.of<BottomNavBarCubit>(context).currentIndex = 0;
CacheHelper.saveData(
key: 'token',
value: BlocProvider.of<RegisterCubit>(context).registerModel!.token,
);
print('token = ${BlocProvider.of<RegisterCubit>(context).registerModel!.token}');
Navigator.push(context, MaterialPageRoute(builder: (context){
return const AppView();
}));
}
if (state is RegisterFailureState){
showToastMessage(
context,
message: state.errorMessage,
state: ToastStates.ERROR,
);
}
},
builder: (context, state) {
return AbsorbPointer(
absorbing: state is ForgotPasswordReceiveCodeLoadingState || state is RegisterSuccessState ? true : false,
child: Scaffold(
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Center(
child: SingleChildScrollView(
child: Form(
key: forgotPasswordCubit.verifyCodeFormKey,
autovalidateMode: forgotPasswordCubit.verifyCodeAutoValidateMode,
child: Column(
children: [
SvgPicture.asset(
kBookLogo,
height: 150,
width: 150,
),
const Text(
'Booki',
style: TextStyle(
fontSize: 60,
fontFamily: 'Pacifico',
fontWeight: FontWeight.bold,
color: kPrimaryColor,
),
),
const SizedBox(
height: 50,
),
Row(
children: [
Text(
'Enter 6 Digits Code',
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
fontWeight: FontWeight.bold,
),
),
],
),
const SizedBox(
height: 8,
),
Text(
'Enter the 6 digits code that you received on your email.',
style: Theme.of(context).textTheme.bodyMedium!.copyWith(
fontSize: 16,
),
),
const SizedBox(
height: 50,
),
PinCodeTextField(
appContext: context,
length: 6,
obscureText: false,
animationType: AnimationType.fade,
pinTheme: PinTheme(
shape: PinCodeFieldShape.box,
borderRadius: BorderRadius.circular(5),
fieldHeight: 50,
fieldWidth: 40,
inactiveColor: Colors.grey[600],
inactiveFillColor: Colors.white,
selectedColor: kPrimaryColor,
selectedFillColor: Colors.white,
activeFillColor: Colors.white,
),
animationDuration: const Duration(milliseconds: 300),
enableActiveFill: true,
keyboardType: TextInputType.number,
controller: codeController,
validator: (value){
if (value?.isEmpty ?? true){
return 'PIN must be not empty';
} else{
return null;
}
},
onCompleted: (v) {
FocusManager.instance.primaryFocus?.unfocus();
},
// beforeTextPaste: (text) {
// return false;
// },
),
const SizedBox(
height: 24,
),
ConditionalBuilder(
condition: state is! ForgotPasswordReceiveCodeLoadingState || state is! RegisterLoadingState,
builder: (context) => CustomTextButton(
text: 'Confirm Code',
onTap: (){
if (forgotPasswordCubit.verifyCodeFormKey.currentState!.validate()){
forgotPasswordCubit.verifyCodeFormKey.currentState!.save();
if (codeController.text.trim().length < 6){
showToastMessage(
context,
message: 'Code must be 6 digits',
state: ToastStates.ERROR,
);
} else{
if (isRegister){
BlocProvider.of<RegisterCubit>(context).registerUser(
email: email,
code: codeController.text,
);
} else{
forgotPasswordCubit.receiveCodeFromUser(
email: email,
resetCode: codeController.text,
);
}
}
} else{
forgotPasswordCubit.verifyCodeChangeAutoValidateMode();
}
},
),
fallback: (context) => const Center(child: CircularProgressIndicator()),
),
const SizedBox(
height: 4,
),
TextButton(
onPressed: (){
Navigator.pop(context);
},
child: const Text(
'Enter another email?',
style: TextStyle(
color: Colors.grey,
fontSize: 16,
),
),
),
],
),
),
),
),
),
),
);
},
);
},
),
);
}
}
Я не нашел решения этой проблемы и хочу ввести другой адрес электронной почты, чтобы это исключение не возникло. Я нашел решение здесь, но оно у меня не работает.
Скажите, пожалуйста, нужны ли дополнения к вопросу?





Пожалуйста, обновите виджет без сохранения состояния до виджета StateFul и добавьте эти коды.
@override
void dispose() {
_controller.dispose();
//dispose Your Text Controller here
super.dispose();
}
я поделился только частью кода, но я использую контроллер электронной почты в поле текстовой формы, и проблема возникает, когда нужно изменить адрес электронной почты, но если я введу адрес электронной почты и продолжу процесс сброса пароля, код будет работать правильно
Но не вижу текстового ввода в функции сборки!
Пожалуйста, распечатайте emailController.text в прослушивателе, как прослушиватель: (контекст, состояние) { if (state is ForgotPasswordSendCodeSuccessState) { print(emailController.print); // вывод будет пустым или нулевым }
я добавил весь код ForgotPasswordView и VerifyCodeView, можете ли вы помочь мне решить эту проблему
обновил ответ, попробуйте этот способ
теперь я нахожу причину проблемы, если кто-то использует пакет @pin_code_fields, должен использовать это решение с контроллером пин-кода, я думал, что проблема в контроллере электронной почты, а не в контроллере пакета
Пожалуйста, поделитесь кодом виджета
VerifyCodeView.