dart 当推送到另一个屏幕并弹出时,我不能使用已释放的TextEditingController,我的理解正确吗?

zysjyyx4  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(145)

我有一个创建帖子的屏幕。那里有一个TextFormField,我把dispose添加到它的TextEditingController。但是,我得到一个错误:

════════ Exception caught by widgets library ═══════════════════════════════════
A TextEditingController was used after being disposed.
════════════════════════════════════════════════════════════════════════════════

如果我的理解是正确的,我认为它是说我不能使用已处理的TextEditingController当我推到另一个屏幕弹出。希望大家告诉我,如果我的理解是正确的。
我引用了this answer,但它没有解决我的问题。
我的代码:

TextEditingController messageController = TextEditingController();

class CreatePostScreen extends ConsumerStatefulWidget {
  const CreatePostScreen({super.key});

  @override
  ConsumerState<CreatePostScreen> createState() => _CreatePostScreenState();
}

class _CreatePostScreenState extends ConsumerState<CreatePostScreen> with AutomaticKeepAliveClientMixin {
  @override
  void dispose() {
    messageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    super.build(context);

    …

    return Scaffold(
      appBar: AppBar(
        …
        title: Text("Create post"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(10.0),
        child: Column(
          children: [
            …
            TextFormField(
              controller: enquiryMessageController,
              style: const TextStyle(color: Colors.black),
              decoration: InputDecoration(
                border: InputBorder.none,
                hintText: "What do you wish to enquire?",
                hintStyle: const TextStyle(color: Colors.black),
              ),
              keyboardType: TextInputType.text,
              textInputAction: TextInputAction.done,
            ),
          ],
        ),
      ),
    );
  }
}

messageControllerConsumerStatefulWidget之外,因为代码是为了使TextFormField中的文本不消失,请参考this answer
如果您需要更多信息,请随时发表评论。
我不能使用一个已处理的TextEditingController,当推到另一个屏幕并弹出时,我的理解正确吗?我将感谢任何帮助。提前感谢!

qij5mzcb

qij5mzcb1#

您可以尝试按以下方式定义控制器:

class CreatePostScreen extends ConsumerStatefulWidget {
  const CreatePostScreen({super.key});

  @override
  ConsumerState<CreatePostScreen> createState() => _CreatePostScreenState();
}

class _CreatePostScreenState extends ConsumerState<CreatePostScreen> with AutomaticKeepAliveClientMixin {
late TextEditingController messageController;

  @override
  void initState() {
    messageController = TextEditingController();
    super.initState();
  }

  @override
  void dispose() {
    messageController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    super.build(context);

    …

    return Scaffold(
      appBar: AppBar(
        …
        title: Text("Create post"),
      ),
      body: Padding(
        padding: const EdgeInsets.all(10.0),
        child: Column(
          children: [
            …
            TextFormField(
              controller: enquiryMessageController,
              style: const TextStyle(color: Colors.black),
              decoration: InputDecoration(
                border: InputBorder.none,
                hintText: "What do you wish to enquire?",
                hintStyle: const TextStyle(color: Colors.black),
              ),
              keyboardType: TextInputType.text,
              textInputAction: TextInputAction.done,
            ),
          ],
        ),
      ),
    );
  }
}
pn9klfpd

pn9klfpd2#

我看到你把它声明为一个全局变量。(从小部件树中删除),dispose被执行。因此,您的全局TextEditingController被处理。这是一个非常糟糕的做法。您需要在_CreatePostScreenState类中定义它。因此,每当屏幕小部件启动时,也将创建一个新的控制器小部件。我希望,这解决了您的问题。如果没有,然后请编辑问题,添加错误消息,并从错误日志中找到代码行。

相关问题