Я пытался сделать контроллер чата постоянным, но не получилось. т работаю. Как я могу заставить фоновую изоляцию Firebase использовать существующий контроллер чата? если я не могу, то как я могу общаться между двумя разными изолятами? Я видел ответ о том, как общаться с фоновой изоляцией Firebase, но ничего не понял XD.
Код: Выделить всё
if (Get.isRegistered()) {
// If the controller is already registered, reuse it
chatController = Get.find();
print("Chat Controller Found");
} else {
// If the controller is not registered, initialize it
chatController = Get.put(ChatController());
await chatController
.getChats(); // Only fetch chats on the first initialization
print("Chat Controller Created!");
}
chatController.addMessageToChat(
int.parse(message.data["chat_id"]),
chatMessage,
);
Код: Выделить всё
class ChatController extends GetxController with WidgetsBindingObserver {
final DioClient _dioClient = DioClient();
RxInt currentChat = (-1).obs;
RxList chats = [].obs;
RxBool isInBackground = false.obs;
RxList backgroundMessages = [].obs;
RxList chatMessages = [].obs;
@override
void onInit() {
super.onInit();
getChats();
WidgetsBinding.instance.addObserver(this); // Add observer for app lifecycle
}
@override
void onClose() {
WidgetsBinding.instance
.removeObserver(this); // Remove observer when controller is destroyed
super.onClose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
// App comes back to foreground, refresh data
isInBackground.value = false;
for (ChatMessage message in backgroundMessages) {
print("Message added from backgroundMessages");
addMessageToChat(message.chatId, message);
}
backgroundMessages.clear();
} else if (state == AppLifecycleState.paused) {
isInBackground.value = true;
}
print("isInBackground from life cycle: ${isInBackground.value}");
}
void addMessageToChat(int chatId, ChatMessage message) {
print("isInBackground from add message: ${isInBackground.value}");
// if (isInBackground.value) {
// backgroundMessages.add(message);
// print("Message added to backgroundMessages");
// return;
// } else {
// print("Message added to chatMessages");
// }
// Find the chat
Chat chat = chats.firstWhere((chat) => chat.id == chatId);
if (chat.id != -1) {
chat.messages.add(message);
Map messageMap = message.toMap();
messageMap['created_at'] = formatMessageDate(
message.createdAt.toLocal().toIso8601String(),
Global.activeUser!.timezone ?? "UTC");
messageMap['sender']['name'] =
messageMap['sender']['member_id'] == chat.userId
? "You"
: messageMap['sender']['name'];
if (messageMap['sender']['member_id'] != chat.userId) {
chat.counter = currentChat.value != chatId ? chat.counter + 1 : 0;
}
chat.lastMessageMap = messageMap;
// Update the list by reordering the chat without rebuilding the entire list
int currentIndex = chats.indexOf(chat);
if (currentIndex != 0) {
chats.removeAt(currentIndex);
chats.insert(0, chat);
chats.refresh(); // This will trigger a partial rebuild
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... -with-getx
Мобильная версия