Как обрабатывать фоновый FCM с помощью GetXAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Как обрабатывать фоновый FCM с помощью GetX

Сообщение Anonymous »

Я создаю раздел чата в своем приложении. Я заканчивал обработку сообщений с данными, отправленных с сервера на устройства, когда случайно наткнулся на серьезную проблему, когда Firebase открывала новый изолят для запуска фоновых задач. Я использую контроллер GetX ChatController, который имеет переменную Chats типа RxList. В каждом чате есть список сообщений. обычно, когда кто-то отправляет сообщение, а устройство находится на переднем плане, я беру новое сообщение, выполняю некоторую сериализацию здесь и там и добавляю его в соответствующий чат в чатах ChatController. Когда вы делаете то же самое в фоновом режиме, но он просто повторно инициализирует новое сообщение вообще без каких-либо данных, что останавливает процесс добавления нового сообщения.
Я пытался сделать контроллер чата постоянным, но не получилось. т работаю. Как я могу заставить фоновую изоляцию 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,
);
ChatController.dart:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»