跳到主要内容

设置会话免打扰

Flutter IM Kit 支持按会话设置免打扰功能。设置免打扰后,该会话的新消息将不会显示本地通知提醒,但消息仍会正常接收和存储。

会话的免打扰状态会自动同步到融云服务端,并在多设备间保持一致。

设置会话免打扰状态

通过 RCKConvoProvider 可以切换单个会话的免打扰状态:

Dart
final convoProvider = Provider.of<RCKConvoProvider>(context, listen: false);

// 切换会话免打扰状态
convoProvider.blockConversation(conversationIndex);

该方法会自动判断当前会话的免打扰状态,并进行相应的切换:

  • 如果会话当前为免打扰状态,则取消免打扰
  • 如果会话当前为正常状态,则设置为免打扰

检查会话免打扰状态

通过会话对象的 notificationLevel 属性可以判断免打扰状态:

Dart
bool isBlocked = conversation.notificationLevel == RCIMIWPushNotificationLevel.blocked;

if (isBlocked) {
// 会话已设置免打扰
} else {
// 会话未设置免打扰
}

免打扰状态同步

免打扰设置会自动在不同设备间同步。可以通过监听器获取同步通知:

Dart
final engineProvider = Provider.of<RCKEngineProvider>(context, listen: false);

// 监听免打扰状态同步
engineProvider.engine?.onConversationNotificationLevelSynced = (synced) {
// 处理同步后的免打扰状态更新
for (var item in synced) {
print('会话 ${item.targetId} 免打扰状态已同步');
// 更新本地UI状态
}
};

UI 交互支持

长按菜单操作

在会话列表中长按会话项,可以在弹出菜单中添加免打扰选项:

Dart
PopupMenuButton<String>(
itemBuilder: (context) => [
PopupMenuItem(
value: 'mute',
child: Row(
children: [
Icon(isBlocked ? Icons.volume_up : Icons.volume_off),
SizedBox(width: 8),
Text(isBlocked ? '取消免打扰' : '免打扰'),
],
),
),
],
onSelected: (value) {
if (value == 'mute') {
convoProvider.blockConversation(index);
}
},
)

滑动操作

支持通过滑动手势快速设置免打扰:

Dart
Slidable(
endActionPane: ActionPane(
motion: ScrollMotion(),
children: [
SlidableAction(
onPressed: (context) => convoProvider.blockConversation(index),
backgroundColor: Colors.grey,
foregroundColor: Colors.white,
icon: isBlocked ? Icons.volume_up : Icons.volume_off,
label: isBlocked ? '取消免打扰' : '免打扰',
),
],
),
child: conversationItem,
)

免打扰图标显示

配置免打扰图标

通过 RCKConversationConfig 配置免打扰图标的显示样式:

Dart
RCKConversationConfig(
muteIconConfig: RCKMuteIconConfig(
icon: Icons.volume_off,
size: 16.0,
color: Colors.grey,
position: RCKMuteIconPosition.titlePrefix,
),
)

图标位置选项

免打扰图标支持多种显示位置:

位置选项说明
titlePrefix标题前方
titleSuffix标题后方
avatarOverlay头像叠加
messagePrefix消息前方

未读消息处理

设置免打扰的会话在有新消息时:

  1. 消息接收:正常接收并存储消息
  2. 本地通知:不显示本地通知提醒
  3. 未读计数:仍会更新未读消息数量
  4. UI 显示:显示特殊的免打扰徽章样式
Dart
RCKUnreadBadgeConfig(
showMuteBadge: true, // 显示免打扰徽章
muteBadgeColor: Colors.grey, // 免打扰徽章颜色
normalBadgeColor: Colors.red, // 正常徽章颜色
)

注意事项

状态一致性

免打扰状态的修改是异步操作,设置后需等待服务端响应确认。建议在操作完成后通过监听器或回调处理UI更新。

性能优化

免打扰状态检查在消息接收时进行,不会影响消息的正常存储和同步,只是不显示本地通知提醒。

适用范围

免打扰功能适用于所有会话类型,包括单聊、群聊和系统通知会话。