submitEditing method

Future<bool> submitEditing(
  1. RCKChatProvider chatProvider, {
  2. int maxLength = 5000,
  3. 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;
}