Code Monkey home page Code Monkey logo

Comments (3)

JiangJuHong avatar JiangJuHong commented on July 20, 2024

暂时不支持自定义ID功能,如果您需要实现该功能,可以参考以下解决方案:

class ImChatDataManager extends ValueNotifier<void> {  
  /// 当前界面聊天数据内容
  List<DataEntity> data = [];

    /// 发送消息
  sendMessage(MessageNode node) async {
    if (loginUserInfo == null) {
      Fluttertoast.showToast(msg: "消息发送失败,请重试!");
      return;
    }

    // 添加到消息队列
    String randomId = UuidUtil.getUuid();
    this.data.add(
          DataEntity(
            id: randomId,
            status: ImChatMessageStatus.Sending,
            message: MessageEntity(
              id: this.id,
              sessionType: type,
              self: true,
              elemList: [node],
              userInfo: loginUserInfo,
            ),
          ),
        );

    // 更新滚动条到底部
    notifyListeners();
    toBottom();

    // 发送消息,在有结果后进行更新操作
    await MessageUtil.sendMessage(
      session: SessionEntity(
        id: this.id,
        type: this.type,
      ),
      node: node,
      dateSender: (dateMessage) => this.insertDataByRandomId(
        randomId,
        dateMessage,
        notify: false,
      ),
    ).then((res) {
      this.updateDataStatusByRandomId(randomId, ImChatMessageStatus.Success, message: res);
    }).catchError((res) {
      this.updateDataStatusByRandomId(randomId, ImChatMessageStatus.Error);
    });

    notifyListeners();
    toBottom();
  }

  /// 根据随机ID 更新消息对象
  updateDataStatusByRandomId(String randomId, ImChatMessageStatus status, {MessageEntity message}) {
    // 因为更新的对象一般都是发送消息时添加进去的,所以一定程度上来说,倒序查找要快一点
    for (int index = this.data.length - 1; index > 0; index--) {
      DataEntity entity = this.data[index];
      if (entity.id == randomId) {
        this.data[index].status = status;
        if (message != null) {
          this.data[index].message = message;
        }
        break;
      }
    }
    notifyListeners();
  }

  /// 更新消息对象
  updateMessage(MessageEntity message) {
    for (int i = 0; i < this.data.length; i++) {
      if (message == this.data[i].message) {
        this.data[i].message = message;
        notifyListeners();
        break;
      }
    }
  }

  /// 删除消息
  removeMessage(MessageEntity message) {
    int index = -1;
    for (int i = 0; i < this.data.length; i++) {
      if (message == this.data[i].message) {
        index = i;
        break;
      }
    }
    if (index != -1) {
      this.data.removeAt(index);
      notifyListeners();
    }
  }

  /// 添加单条数据,根据随机ID
  insertDataByRandomId(String randomId, MessageEntity item, {notify: true}) {
    for (int i = 0; i < this.data.length; i++) {
      if (this.data[i].id == randomId) {
        this.data.insert(
              i,
              DataEntity(
                message: item,
                status: getMessageStatus(item),
              ),
            );

        if (notify) {
          notifyListeners();
        }
        break;
      }
    }
  }

  /// 添加单条数据
  insertData(int index, MessageEntity item, {notify: true}) {
    this.data.insert(
          index,
          DataEntity(
            message: item,
            status: getMessageStatus(item),
          ),
        );

    if (notify) {
      notifyListeners();
    }
  }

}

使用方式例子为:

        imChatDataManager.sendMessage(ImageMessageNode(
          path: value.resource,
        ));

DataEntity实体为:

/// 数据实体
class DataEntity {
  /// 消息ID(仅在一次会话中有效)
  String id;

  /// 消息对象
  MessageEntity message;

  /// 状态
  ImChatMessageStatus status;

  DataEntity({
    this.id,
    this.message,
    this.status,
  });
}

/// Im消息状态
enum ImChatMessageStatus {
  /// 发送中
  Sending,

  /// 发送成功
  Success,

  /// 发送失败
  Error,
}

以上代码为我在其他项目中的实践,如果您有更好的办法,欢迎提出!

from fluttertencentimplugin.

JiangJuHong avatar JiangJuHong commented on July 20, 2024

参考以上回答,简要描述:
关键核心代码:

sendMessage(MessageNode node) async {
    if (loginUserInfo == null) {
      Fluttertoast.showToast(msg: "消息发送失败,请重试!");
      return;
    }

    // 添加到消息队列
    String randomId = UuidUtil.getUuid();
    this.data.add(
          DataEntity(
            id: randomId,
            status: ImChatMessageStatus.Sending,
            message: MessageEntity(
              id: this.id,
              sessionType: type,
              self: true,
              elemList: [node],
              userInfo: loginUserInfo,
            ),
          ),
        );

    // 更新滚动条到底部
    notifyListeners();
    toBottom();

    // 发送消息,在有结果后进行更新操作
    await MessageUtil.sendMessage(
      session: SessionEntity(
        id: this.id,
        type: this.type,
      ),
      node: node,
      dateSender: (dateMessage) => this.insertDataByRandomId(
        randomId,
        dateMessage,
        notify: false,
      ),
    ).then((res) {
      this.updateDataStatusByRandomId(randomId, ImChatMessageStatus.Success, message: res);
    }).catchError((res) {
      this.updateDataStatusByRandomId(randomId, ImChatMessageStatus.Error);
    });

    notifyListeners();
    toBottom();
  }

实现思路为:

  1. 在消息节点之上再封装一个自定义数据对象,并存储想要的属性
  2. 先将待发送数据添加到消息队列,此时状态为发送中
  3. 在发送成功或失败后更新消息队列,此时状态为对应的发送状态

from fluttertencentimplugin.

anlzy avatar anlzy commented on July 20, 2024

问题解决了,感谢。

from fluttertencentimplugin.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.