submitEditing method
Future<bool>
submitEditing(
- RCKChatProvider chatProvider, {
- int maxLength = 5000,
- Future<
void> beforeLeaveEditing()?,
修改请求建立后退出编辑态,消息气泡继续展示更新中或失败状态。
全屏编辑可通过 beforeLeaveEditing 等待退出动画;动画失败不会回滚
已经建立的修改请求。
Implementation
Future<bool> submitEditing(
RCKChatProvider chatProvider, {
int maxLength = 5000,
Future<void> Function()? beforeLeaveEditing,
}) async {
final message = _editingMessage;
final content = _controller.text;
if (message == null ||
_editSubmitting ||
content.trim().isEmpty ||
content.characters.length > maxLength ||
!chatProvider.canEditMessage(message)) {
return false;
}
final operationId = _editOperationId;
_editSubmitting = true;
notifyListeners();
final latestMessage = await chatProvider.resolveMessageForEditing(message);
if (_disposed ||
operationId != _editOperationId ||
!isEditingMessage(message)) {
return false;
}
if (latestMessage == null) {
_editSubmitting = false;
notifyListeners();
return false;
}
final mentionUserIds = List<String>.unmodifiable(
_mentionUserIdsForContent(content),
);
final started = await chatProvider.beginModifyMessage(
latestMessage,
content,
mentionUserIds: mentionUserIds,
canStart: () =>
!_disposed &&
operationId == _editOperationId &&
isEditingMessage(message) &&
// 提交预检和创建内容对象可能跨越多个 event loop。若用户在
// 等待期间修改了输入,不能把旧快照提交后再清掉新文本。
_controller.text == content,
);
if (_disposed ||
operationId != _editOperationId ||
!isEditingMessage(message)) {
return false;
}
if (!started) {
_editSubmitting = false;
notifyListeners();
return false;
}
if (beforeLeaveEditing != null) {
try {
await beforeLeaveEditing();
} catch (_) {
// 修改请求已经建立,退出动画失败不能阻止编辑态收尾。
}
}
if (_disposed ||
operationId != _editOperationId ||
!isEditingMessage(message)) {
return true;
}
await _leaveEditing(
chatProvider,
clearEditedDraft: true,
restoreConversationDraft: false,
);
final messages = chatProvider.messages;
if (message.messageUId != null &&
messages.isNotEmpty &&
messages.last.messageUId == message.messageUId) {
chatProvider.messageListScrollToBottom();
}
return true;
}