为什么dispose方法没有被调用?

问题描述 投票:0回答:1

我试图使用提供程序来管理 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"),
          ),
        ],
      ),
    ),
  ),
);
}
}
flutter dart state provider state-management
1个回答
0
投票

尝试使用

extend
ChangeNotifier 而不是与
modifier

一起使用
class AddonViewModel extends ChangeNotifier {
  /// CONSTRUCTOR
  AddonViewModel();

  @override
  void dispose() {
    super.dispose();
    try {
      paymentFinishedWebViewClosedSubscription?.cancel();
    } on Exception catch (_) {}
  }
}

这应该有效。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.