Я столкнулся с проблемой с TextFormField, когда я что-то набираю на клавиатуре, оно не появляется в текстовом поле, я пытаюсь создать приложение чата с BLOC. Примечание: когда я удаляю эту строку... я могу печатать нормально, и проблема исчезла, но появляются 2 ошибки. Первая заключается в том, что когда я вхожу в чат с кем-то, старые сообщения не появляются, пока я не отправлю ему новое сообщение... вторая возникает, когда я ввожу другое сообщение. общаться с кем-то другим, сообщения первого пользователя отображаются для другого пользователя, и чтобы решить эту проблему, я должен выйти со страницы чата и войти снова, чтобы увидеть сообщения разыскиваемого пользователя, с которым я сейчас общаюсь с ним/ проблема в том, что когда я набираю любой символ на клавиатуре, он не печатается в текстовом поле, и это дает мне это: getTextBeforeCursor при неактивном InputConnection getSelectedText для неактивного InputConnection getTextAfterCursor при неактивном InputConnection
вот мой код
List<SocialUserModel> users =[];
void getUsers()
{
if (users.length ==0)
FirebaseFirestore.instance.collection('users').get().then((value)
{
value.docs.forEach((element)
{
if (element.data()['uId'] != userModel!.uId)
users.add(SocialUserModel.fromJson(element.data()));
});
emit(SocialGetAllUsersSuccessState());
})
.catchError((error){
emit(SocialGetAllUsersErrorState(error.toString()));
});
}
void sendMessage({
required String receiverId,
required String dateTime,
required String text,
})
{
MessageModel model = MessageModel(
text: text,
senderId: userModel!.uId,
receiverId: receiverId,
dateTime: dateTime,
);
// set my chats
FirebaseFirestore.instance
.collection('users')
.doc(userModel!.uId)
.collection('chats')
.doc(receiverId)
.collection('messages')
.add(model.toMap())
.then((value){
emit(SocialSendMessageSuccessState());
})
.catchError((error)
{
emit(SocialSendMessageErrorState());
});
// set receiver chats
FirebaseFirestore.instance
.collection('users')
.doc(receiverId)
.collection('chats')
.doc(userModel!.uId)
.collection('messages')
.add(model.toMap())
.then((value){
emit(SocialSendMessageSuccessState());
})
.catchError((error)
{
emit(SocialSendMessageErrorState());
});
}
List<MessageModel> messages = [];
void getMessages({
required String receiverId,
})
{
FirebaseFirestore.instance
.collection('users')
.doc(userModel!.uId!)
.collection('chats')
.doc(receiverId)
.collection('messages')
.orderBy('dateTime')
.snapshots()
.listen((event)
{
messages=[];
event.docs.forEach((element)
{
messages.add(MessageModel.fromJson(element.data()));
});
emit(SocialGetMessageSuccessState());
});
}
//экран получения пользователя
class ChatsScreen extends StatelessWidget {
const ChatsScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return BlocConsumer<SocialCubit,SocialStates>(
listener: (context,state){},
builder: (context,state)
{
return ConditionalBuilder(
condition: SocialCubit.get(context).users.length > 0,
builder: (context) => ListView.separated(
physics: BouncingScrollPhysics(),
itemBuilder: (context, index) => buildChatItem(context,SocialCubit.get(context).users[index]),
separatorBuilder: (context, index) => SizedBox(height:1),
itemCount: SocialCubit.get(context).users.length
),
fallback: (context) => Center(child: CircularProgressIndicator()),
);
}
);
}
Widget buildChatItem(BuildContext context,SocialUserModel model) => InkWell(
onTap: ()
{
Navigator.push(context, MaterialPageRoute(builder: (context) => ChatDetailsScreen(userModel: model)));
},
child: Padding(
padding: const EdgeInsets.all(20.0),
child: Row(
children:
[
CircleAvatar(
radius: 25,
backgroundImage: NetworkImage(
'${model.image}'
),
),
SizedBox(width: 15,),
Row(
children: [
Text(
'${model.name}',
),
],
),
],
),
),
);
}
//Экран чата
class ChatDetailsScreen extends StatelessWidget {
SocialUserModel? userModel;
final messageController = TextEditingController();
ChatDetailsScreen({this.userModel}) {}
@override
Widget build (context) {
return Builder(
builder: (context)
{
SocialCubit.get(context).getMessages(receiverId: userModel!.uId!);
return BlocConsumer<SocialCubit,SocialStates>(
listener: (context,state) {},
builder: (context,state)
{
return Scaffold(
appBar: AppBar(
titleSpacing: 0,
title: Row(
children: [
CircleAvatar(
radius: 20,
backgroundImage: NetworkImage(userModel!.image!),
),
SizedBox(
width: 15,
),
Text(
userModel!.name!,
)
],
),
),
body: Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
children: [
Expanded(
child: ListView.separated(
physics: BouncingScrollPhysics(),
itemBuilder: (context,index)
{
var message = SocialCubit.get(context).messages[index];
if (SocialCubit.get(context).userModel!.uId == message.senderId)
return buildMyMessage(message);
return buildMessage(message);
},
separatorBuilder: (context,index) => SizedBox(height: 7,),
itemCount: SocialCubit.get(context).messages.length
),
),
Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.grey[300]!,
width: 1,
),
borderRadius: BorderRadius.circular(15)
),
clipBehavior: Clip.antiAliasWithSaveLayer,
child: Row(
children:
[
SizedBox(width: 10,),
Expanded(
child: TextFormField(
controller: messageController,
decoration: InputDecoration(
border: InputBorder.none,
hintText: 'type your message here...',
),
),
),
Container(
height: 50,
color: Colors.blue,
child: MaterialButton(onPressed:()
{
SocialCubit.get(context).sendMessage(
receiverId: userModel!.uId!,
dateTime: DateTime.now().toString(),
text: messageController.text,
);
},
minWidth: 1,
child: Icon(
IconBroken.Send,
size: 16,
color: Colors.white,
),),
)
],
),
)
],
),
),
);
}
);
}
);
}
Widget buildMessage(MessageModel model) => Align(
alignment: AlignmentDirectional.centerStart,
child: Container(
decoration:BoxDecoration(
color: Colors.grey[300],
borderRadius: BorderRadiusDirectional.only(
bottomEnd: Radius.circular(10),
topEnd: Radius.circular(10),
topStart: Radius.circular(10),
)
),
padding: EdgeInsets.symmetric(
vertical: 5,
horizontal: 10,
),
child: Text(
model.text!,
),
),
);
Widget buildMyMessage(MessageModel model) => Align(
alignment: AlignmentDirectional.centerEnd,
child: Container(
decoration:BoxDecoration(
color: Colors.blue.withOpacity(.2),
borderRadius: BorderRadiusDirectional.only(
bottomStart: Radius.circular(10),
topEnd: Radius.circular(10),
topStart: Radius.circular(10),
)
),
padding: EdgeInsets.symmetric(
vertical: 5,
horizontal: 10,
),
child: Text(
model.text!,
),
),
);
}
извините, если я не могу объяснить .. все еще новичок здесь
я решил проблему я преобразовал виджет без сохранения состояния в состояние с сохранением состояния