You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中TextEditingController.text返回空而非输入内容如何解决?

Flutter TextEditingController取值为空解决方案

问题根因

你在_AddQuestionState的build方法执行时就直接把questionController.text传给了AddUser组件,Flutter首次构建页面时输入框还没有任何输入,此时questionController.text就是初始空值,且这个值传入AddUser后就被保存在final String question属性里,后续你在输入框输入内容时,AddUser里的question不会自动同步更新,所以调用addUser方法时打印的永远是首次构建时传入的空字符串。

修复方案

这里提供两种常用的修复方式:

方案1:传入TextEditingController而非固定字符串

直接把控制器实例传给AddUser,调用addUser时读取控制器的实时文本值:

  1. 修改_AddQuestionState中调用AddUser的代码:
// 原有写法
AddUser(questionController.text)
// 替换为
AddUser(questionController)
  1. 修改AddUser类的定义:
class AddUser extends StatelessWidget {
  final TextEditingController questionController;

  AddUser(this.questionController);
  
  @override
  Widget build(BuildContext context) {
    // Create a CollectionReference called users that references the firestore collection
    CollectionReference users = FirebaseFirestore.instance.collection('Questions').doc("cse").collection("CSE");

    Future<void> addUser() {
      // 读取当前实时的输入值
      final question = questionController.text;
      print(question);
      // Call the user's CollectionReference to add a new user
      return users
          .add({
        'question': question,
      })
          .then((value) => print("User Added"))
          .catchError((error) => print("Failed to add user: $error"));
    }
    // 剩余原有build逻辑保持不变
  }
}

方案2:点击提交时再取值传递

如果AddUser是提交交互组件,也可以在点击回调里实时取questionController.text再执行上传逻辑,不需要提前传给AddUser:

// AddQuestion的children里的提交按钮逻辑修改为
ElevatedButton(
  onPressed: () {
    // 点击时直接取当前输入值
    final currentQuestion = questionController.text;
    // 直接执行上传逻辑即可
  },
  child: Text('提交问题'),
)

内容的提问来源于stack exchange,提问作者Vinasirajan Vilakshan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:57:02