Flutter中TextEditingController.text返回空而非输入内容如何解决?
Flutter TextEditingController取值为空解决方案
问题根因
你在_AddQuestionState的build方法执行时就直接把questionController.text传给了AddUser组件,Flutter首次构建页面时输入框还没有任何输入,此时questionController.text就是初始空值,且这个值传入AddUser后就被保存在final String question属性里,后续你在输入框输入内容时,AddUser里的question不会自动同步更新,所以调用addUser方法时打印的永远是首次构建时传入的空字符串。
修复方案
这里提供两种常用的修复方式:
方案1:传入TextEditingController而非固定字符串
直接把控制器实例传给AddUser,调用addUser时读取控制器的实时文本值:
- 修改
_AddQuestionState中调用AddUser的代码:
// 原有写法 AddUser(questionController.text) // 替换为 AddUser(questionController)
- 修改
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
相关产品推荐
相关产品推荐

