flutter - Flutter - Input TextField gets cleared by TextEditingController but the entered message appears to be 'still alive' (not empty)
问题描述
I have a chat-app that uses a single TextField controlled by a TextEditingController to enter text messages. Pressing the associated IconButton sends the message if the message is not empty and then clears the TextEditingController. This all works perfectly. After sending the message, the text input field gets cleared.
BUT, here comes the bug, if I press the send button again, the message is sent once more. How come and how can I prevent this?
class NewMessage extends StatefulWidget {
@override
_NewMessageState createState() => _NewMessageState();
}
class _NewMessageState extends State<NewMessage> {
final _controller = TextEditingController();
var _enteredMessage = '';
void _sendMessage() async {
FocusScope.of(context).unfocus();
final user = FirebaseAuth.instance.currentUser;
final userData = await FirebaseFirestore.instance
.collection('users')
.doc(user.uid)
.get();
FirebaseFirestore.instance.collection('chat').add({
'text': _enteredMessage,
'createdAt': Timestamp.now(),
'userId': user.uid,
'username': userData.data()['username'],
'userImage': userData.data()['image_url']
});
_controller.clear();
}
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 8),
padding: EdgeInsets.all(8),
child: Row(
children: <Widget>[
Expanded(
child: TextField(
controller: _controller,
textCapitalization: TextCapitalization.sentences,
autocorrect: true,
enableSuggestions: true,
decoration: InputDecoration(labelText: 'Send a message...'),
onChanged: (value) {
setState(() {
_enteredMessage = value;
});
},
),
),
IconButton(
color: Theme.of(context).primaryColor,
icon: Icon(
Icons.send,
),
onPressed: _enteredMessage.trim().isEmpty ? null : _sendMessage,
)
],
),
);
}
}
解决方案
我发现这里最简单的解决方案是更换
onPressed: _enteredMessage.trim().isEmpty ? null : _sendMessage,
和
onPressed: () {
if (_controller.text.trim().isNotEmpty) _sendMessage();
}
推荐阅读
- database - 数据建模 Microsoft Office
- rest - Meteor simple:rest 包不认天文包方法
- c# - 无法将带有 [] 的索引应用于“int”类型的表达式
- java - 在while循环中只执行一次
- kubernetes - 在 kubernetes 集群上运行 mysql 时如何持久化
- pandas - 如何根据 CSV 文件中的数据检索和裁剪图像?
- angular - 使用 Angular 6 登录获取请求
- graph - Neo4j 用户定义函数无法安装
- ruby-on-rails - 根据输入值,让 Rails 的 number_to_percentage 输出动态的小数位数?
- python - 如何让pycharm加载anaconda环境变量