Browse Source

feat(notification): 添加应用角标未读数显示功能

- 在 AndroidManifest.xml 中添加各厂商桌面角标权限配置
- 集成 app_badge_plus 插件实现角标更新功能
- 在 ConversationController 中监听未读数变化并同步更新应用角标
- 优化消息通知逻辑,仅在 APP 前台时显示通知弹框
- 添加角标更新的错误处理和日志记录
master
Jolie 3 months ago
parent
commit
c66b7bcd21
3 changed files with 50 additions and 1 deletions
  1. 22
      android/app/src/main/AndroidManifest.xml
  2. 23
      lib/controller/message/conversation_controller.dart
  3. 6
      lib/im/im_manager.dart

22
android/app/src/main/AndroidManifest.xml

@ -16,6 +16,28 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<!-- Samsung -->
<uses-permission android:name="com.sec.android.provider.badge.permission.READ"/>
<uses-permission android:name="com.sec.android.provider.badge.permission.WRITE"/>
<!-- HTC -->
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.htc.launcher.permission.UPDATE_SHORTCUT"/>
<!-- Sony -->
<uses-permission android:name="com.sonyericsson.home.permission.BROADCAST_BADGE"/>
<uses-permission android:name="com.sonymobile.home.permission.PROVIDER_INSERT_BADGE"/>
<!-- Apex -->
<uses-permission android:name="com.anddoes.launcher.permission.UPDATE_COUNT"/>
<!-- Solid -->
<uses-permission android:name="com.majeur.launcher.permission.UPDATE_BADGE"/>
<!-- Huawei -->
<uses-permission android:name="com.huawei.android.launcher.permission.CHANGE_BADGE" />
<uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS" />
<application
android:label="趣恋恋"
android:name="${applicationName}"

23
lib/controller/message/conversation_controller.dart

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:get/get.dart';
import 'package:im_flutter_sdk/im_flutter_sdk.dart';
import 'package:app_badge_plus/app_badge_plus.dart';
import '../../im/im_manager.dart';
import '../../model/mine/user_base_data.dart';
import '../mine/user_controller.dart';
@ -81,10 +82,28 @@ class ConversationController extends GetxController {
@override
void onInit() {
super.onInit();
//
totalUnreadCount.listen((count) {
_updateAppBadge(count);
});
// IM
_checkAndLoadConversations();
}
///
Future<void> _updateAppBadge(int count) async {
try {
await AppBadgePlus.updateBadge(count);
if (Get.isLogEnable) {
Get.log('✅ [ConversationController] 应用角标已更新: $count');
}
} catch (e) {
if (Get.isLogEnable) {
Get.log('⚠️ [ConversationController] 更新应用角标失败: $e');
}
}
}
/// IM
Future<void> _checkAndLoadConversations() async {
//
@ -481,6 +500,8 @@ class ConversationController extends GetxController {
total += unreadCount;
}
totalUnreadCount.value = total;
//
await _updateAppBadge(total);
if (Get.isLogEnable) {
Get.log('✅ [ConversationController] 总未读数已更新: $total');
}
@ -489,6 +510,8 @@ class ConversationController extends GetxController {
Get.log('⚠️ [ConversationController] 更新总未读数失败: $e');
}
totalUnreadCount.value = 0;
// 0
await _updateAppBadge(0);
}
}

6
lib/im/im_manager.dart

@ -214,7 +214,11 @@ class IMManager {
if (message.direction == MessageDirection.RECEIVE && message.onlineState) {
_parseUserInfoFromMessageExt(message);
//
_checkAndShowNotificationDialog(message);
// APP
final lifecycleState = WidgetsBinding.instance.lifecycleState;
if (lifecycleState == AppLifecycleState.resumed) {
_checkAndShowNotificationDialog(message);
}
}
}
//

Loading…
Cancel
Save