我有一个SearchText
文本字段。由于一切正常,我想知道当我回到同一页面时如何清除文本字段中的文本。现在,当我从页面返回时,搜索文本仍保留在那里。
条件:我正在将值从字段传递到另一页。因此,搜索文本应包含一些文本。
到目前为止,我所做的是:
试图在推送发生后将文本设置为null。 (我有按钮可以转到另一页)
onPressed: (){
Navigator.push(context, new MaterialPageRoute(
builder: (context) => SearchPage(searchText: this.search.text)
));
setState((){this.search.text = '';});
}
出现问题:在将数据推送到另一页之前,搜索文本变为空。我不要
initState()
中将文本设置为null,但是pop仅替换将删除堆栈,而不重做页面。因此该页面不会调用initState()
我也尝试这样做:
Navigator.of(context).pop('NoText': '');
但是我不知道如何在主页上搜索文本或进行更新。
我不想再次推送,因为它将再次将同一页添加到堆栈中。
Page 1 -> Page 2 (press back) -> Page 1 (search text = '')
任何帮助将不胜感激。谢谢:)
答案 0 :(得分:1)
在您的TextEditingController
中添加TextField
,仅在按下另一页后才调用controller.clear()
。
这可以通过在await
函数内使用onPressed
来完成,或者如果您想避免使.then()
异步,则可以使用onPressed' function
回调。 / p>
示例-
//Initialize a controller inside your State class
TextEditingController _controller = TextEditingController();
//Set the _controller on you TextField
TextField(
controller: _controller,
//Rest of your code
)
//Clear the controller after pushing the new page
onPressed: () {
Navigator.push(context, new MaterialPageRoute(
builder: (context) => SearchPage(searchText: this.search.text)
)).then((value) {
//This makes sure the textfield is cleared after page is pushed.
_controller.clear();
});
}
让我知道这是否有帮助!
答案 1 :(得分:0)
这是销毁流行音乐中任何小部件的最佳,最简便的方法,并且可以毫无麻烦地工作。
每次我们弹出任何屏幕时,都会调用dispose()方法。有关更多信息:-dispose method
class _LoginScreenState extends State<LoginScreen> {
TextEditingController userIDTextField = TextEditingController();
TextEditingController passwordTextField = TextEditingController();
final FocusNode userIDFocus = FocusNode();
final FocusNode passwordFocus = FocusNode();
bool showPassword = false;
// TODO: initState
@override
void initState() {
super.initState();
}
// TODO: dispose
@override
void dispose() {
userIDTextField.clear();
passwordTextField.clear();
super.dispose();
}
}