Я создаю раздел чата в своем приложении. Я заканчивал обработку сообщений с данными, отправленных с сервера на устройства, когда случайно наткнулся на серьезную проблему, когда 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
Как установить связь между фоновым изолятом FCM и основным изолятом ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1728738295
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
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79081056/how-to-communicate-between-fcm-background-isolate-and-main-isolate[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия