阻止我的文本输入在我的聊天应用程序中发送空值



我设计了这个应用程序,并将其连接到firebase firestore作为后端,一切都很好,但后来我发现,当按下发送按钮时,即使文本输入字段中没有任何文本,它也会向我的firestore数据库发送一个空值,最终返回一个错误。请告诉我如何解决这个问题。这是涵盖整个过程的代码

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:one_gov_fx/constants.dart';
import 'package:one_gov_fx/widgets/customAppBar.dart';
final FirebaseFirestore _firestore = FirebaseFirestore.instance;
User firebaseUser;
class ChatScreen extends StatefulWidget {
static const String id = "chat_screen";
@override
_ChatScreenState createState() => _ChatScreenState();
}
class _ChatScreenState extends State<ChatScreen> {
final FirebaseAuth _auth = FirebaseAuth.instance;
String messageText;
final messageTextController = TextEditingController();
bool isMe;
@override
void initState() {
// TODO: implement initState
super.initState();
getCurrentUser();
}
void getCurrentUser() async {
try {
final user = _auth.currentUser;
if (user != null) {
firebaseUser = user;
}
} catch (e) {
print(e);
}
}
//  void getMessage() async{
//    final messages = await _firestore.collection('messages').getDocuments();
//    for( var message in messages.documents){
//      print(message.data);
//    }
//  }
//  void messageStream() async {
//    await for (var snapshot in _firestore.collection('messages').snapshots()) {
//      for (var message in snapshot.documents) {
//        print(message.data);
//      }
//    }
//  }
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: Text('Traders Room'),
),
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
MessageStreamWidget(),
Container(
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(
child: Padding(
padding: const EdgeInsets.all(10.0),
child: TextField(
textCapitalization: TextCapitalization.sentences,
maxLines: null,
textInputAction: TextInputAction.newline,
controller: messageTextController,
onChanged: (value) {
messageText = value;
//Do something with the user input.
},
decoration: InputDecoration(
border: OutlineInputBorder(
borderRadius: const BorderRadius.all(
Radius.circular(38),
),
),
hintText: 'Type your message here. Be Nice...!!!'),
),
),
),
Padding(
padding: const EdgeInsets.only(right: 5),
child: IconButton(
color: kPrimaryColor,
icon: Icon(Icons.send),
onPressed: () {
messageTextController.clear();
_firestore.collection('messages').doc().set({
'author': firebaseUser.photoURL,
'sender': firebaseUser.displayName,
'text': messageText,
'timestamp':
DateTime.now().toUtc().millisecondsSinceEpoch
});
},
),
),
],
),
),
],
),
),
);
}
}
class MessageStreamWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return StreamBuilder<QuerySnapshot>(
stream: FirebaseFirestore.instance
.collection('messages')
.orderBy('timestamp', descending: true)
.snapshots(),
//Async Snapshot
builder: (context, snapshot) {
if (!snapshot.hasData) {
return Center(
child: CircularProgressIndicator(
backgroundColor: kPrimaryColor,
),
);
}
final messages = snapshot.data.docs;
List<TextBubble> messageWidgets = [];
for (var message in messages) {
final messageText = message.data()['text'];
final messageSender = message.data()['sender'];
final currentUser = firebaseUser.displayName;
final messageWidget = TextBubble(
sender: messageSender,
text: messageText,
isMe: currentUser == messageSender);
messageWidgets.add(messageWidget);
}
return Expanded(
child: ListView(
reverse: true,
children: messageWidgets,
),
);
},
);
}
}
class TextBubble extends StatelessWidget {
final String sender;
final String text;
final bool isMe;
TextBubble({this.sender, this.text, this.isMe});
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.all(10),
child: Column(
crossAxisAlignment:
isMe ? CrossAxisAlignment.end : CrossAxisAlignment.start,
children: <Widget>[
Text(
sender,
style: TextStyle(color: Colors.black, fontSize: 11),
),
Material(
borderRadius: isMe
? BorderRadius.only(
topLeft: Radius.circular(10),
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10))
: BorderRadius.only(
topRight: Radius.circular(10),
bottomLeft: Radius.circular(10),
bottomRight: Radius.circular(10)),
elevation: 5,
color: isMe ? kPrimaryColor : Colors.white,
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
child: Text(
text,
style: TextStyle(
color: isMe ? Colors.white : Colors.black, fontSize: 16),
),
)),
],
),
);
}
}

您可以在没有消息的情况下禁用该按钮,也可以在函数内部不执行任何操作。要禁用按钮,请传递null而不是函数。

方法1-传递null:

Padding(
padding: const EdgeInsets.only(right: 5),
child: IconButton(
color: kPrimaryColor,
icon: Icon(Icons.send),
// don't pass press callback when text is empty
onPressed: messageText.isEmpty ? null : () {
messageTextController.clear();
_firestore.collection('messages').doc().set({
'author': firebaseUser.photoURL,
'sender': firebaseUser.displayName,
'text': messageText,
'timestamp':
DateTime.now().toUtc().millisecondsSinceEpoch
});
},
),
),

方法2-提前返回:

Padding(
padding: const EdgeInsets.only(right: 5),
child: IconButton(
color: kPrimaryColor,
icon: Icon(Icons.send),
onPressed: () {
// return early if text is empty
if (messageText.isEmpty) return;
messageTextController.clear();
_firestore.collection('messages').doc().set({
'author': firebaseUser.photoURL,
'sender': firebaseUser.displayName,
'text': messageText,
'timestamp':
DateTime.now().toUtc().millisecondsSinceEpoch
});
},
),
),

最新更新