所以我试图在发送消息后清除文本表单,如果消息为空,则应禁用发送按钮,我所拥有的是按钮的 onPressed 永远不会为空,它永远不会被禁用,并且文本被清除但是如果我再次发送,它会在清除之前发送之前的文本(如果这有意义) 因此,如果我发送“Hello”,它显示为空,但按钮仍然处于活动状态,如果我再次重新发送而不输入任何内容,它会发送相同的清除文本,知道我可能做错了什么吗?
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class NewMessage extends StatefulWidget {
@override
_NewMessageState createState() => _NewMessageState();
}
class _NewMessageState extends State<NewMessage> {
final _controller = TextEditingController();
String _enteredMessage = '';
void _sendMessage() async {
setState(() {
_controller.clear();
});
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['username'],
});
}
void sayHello() {
print('hello');
}
@override
Widget build(BuildContext context) {
return Container(
margin: EdgeInsets.only(top: 8),
padding: EdgeInsets.all(8),
child: Row(
children: [
Expanded(
child: TextField(
controller: _controller,
decoration: InputDecoration(labelText: 'Send a message...'),
onChanged: (value) {
setState(() {
_enteredMessage = value;
});
},
),
),
IconButton(
icon: Icon(Icons.send, color: Theme.of(context).primaryColor),
onPressed: _enteredMessage.trim().isEmpty ? null : _sendMessage,
)
],
),
);
}
}
出现错误的原因是您将输入存储在
enteredText
变量中,但正在清除控制器的文本,两者是不同的。这就是为什么您的 enteredText
在清除后仍然保留并发送相同的字符串。
如果您提供了控制器,则不必使用单独的变量来保存输入文本。控制器已经保存了输入的值。进行以下更改:
IconButton(
...,
onPressed: (){
_controller.text = _controller.text.trim();
if(_controller.text.isNotEmpty) {
_sendMessage();
}
}
)
使用 _controller 中的文本和
_controller.text
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': _controller.text, //<-- Update here
'createdAt': Timestamp.now(),
'userId': user.uid,
'username': userData['username'],
});
setState(() { //<-- Clear at the end
_controller.clear();
});
}
您现在可以摆脱
enteredText
变量和 onChange
回调。
我面临同样的问题,尝试在清除之前添加延迟
Future.delayed(const Duration(milliseconds: 150)).then((_) {
_myTextController.clear();
});