Как установить связь между фоновым изолятом FCM и основным изолятомAndroid

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

Сообщение Anonymous »

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

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

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

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

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

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