【问题标题】:Clear text in the TextField when pop in FlutterFlutter中弹出时清除TextField中的文本
【发布时间】:2019-05-06 10:19:06
【问题描述】:

我有一个SearchText 文本字段。由于一切正常,我想知道当我回到同一页面时如何清除文本字段中的文本。现在,当我从页面返回时,搜索文本仍然存在。

条件:我将字段中的值传递到其他页面。所以搜索文本应该有一些文本。

到目前为止我所做的是:

  • 在推送发生后尝试将文本设置为 null。 (我有按钮可以转到另一个页面)

    onPressed: (){
       Navigator.push(context, new MaterialPageRoute(
         builder: (context) => SearchPage(searchText: this.search.text)
       ));
       setState((){this.search.text = '';});
    }
    

出现问题:在将数据推送到另一个页面之前,搜索文本变为空。这是我不想要的。

  • 试图在我的initState() 中将文本设置为空,但弹出只是替换删除堆栈而不是重做页面。所以页面不会调用initState()

我也尝试过这样做:

Navigator.of(context).pop('NoText': '');

但我不知道在主页中对搜索文本做什么,或者更新它。

我不想再次推送,因为它会将相同的页面再次添加到堆栈中。

Page 1 -> Page 2 (press back) -> Page 1 (search text = '')

任何帮助将不胜感激。谢谢:)

【问题讨论】:

    标签: flutter uitextfield


    【解决方案1】:

    在您的TextField 中添加TextEditingController,并在推送其他页面后才调用controller.clear()

    这可以通过在onPressed 函数中使用await 来完成,或者如果您希望避免使用onPressed 函数async,可以使用.then() 回调。

    例子-

    //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();
       });
    }
    

    如果这有帮助,请告诉我!

    【讨论】:

    • .then() 为我解决了问题。以前它的工作方式相同。谢谢,悉达多。 :)
    • 太棒了!很高兴我能帮忙:)
    • 太棒了,就像一个魅力
    【解决方案2】:

    这是在 pop 上销毁任何小部件的最佳且最简单的方法,而且工作起来毫不费力。

    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();
     }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2019-11-20
      • 1970-01-01
      • 2021-11-18
      • 2021-12-25
      • 2020-11-23
      • 2021-06-10
      相关资源
      最近更新 更多