我有一个创建帖子的屏幕。那里有一个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,
),
],
),
),
);
}
}
messageController
在ConsumerStatefulWidget
之外,因为代码是为了使TextFormField
中的文本不消失,请参考this answer。
如果您需要更多信息,请随时发表评论。
我不能使用一个已处理的TextEditingController
,当推到另一个屏幕并弹出时,我的理解正确吗?我将感谢任何帮助。提前感谢!
2条答案
按热度按时间qij5mzcb1#
您可以尝试按以下方式定义控制器:
pn9klfpd2#
我看到你把它声明为一个全局变量。(从小部件树中删除),
dispose
被执行。因此,您的全局TextEditingController
被处理。这是一个非常糟糕的做法。您需要在_CreatePostScreenState
类中定义它。因此,每当屏幕小部件启动时,也将创建一个新的控制器小部件。我希望,这解决了您的问题。如果没有,然后请编辑问题,添加错误消息,并从错误日志中找到代码行。