updateQuery method

Future<void> updateQuery(
  1. String query
)

Implementation

Future<void> updateQuery(String query) async {
  _query = query;
  List<SearchResult> searchResults = []; // 新的数据结构
  List<Future> searchFutures = [];
  Completer conversationCompleter = Completer();

  engineProvider.engine?.searchConversations(
    [
      RCIMIWConversationType.private,
      RCIMIWConversationType.group,
      RCIMIWConversationType.chatroom,
      RCIMIWConversationType.system,
      RCIMIWConversationType.ultraGroup
    ],
    null,
    [RCIMIWMessageType.text],
    query,
    callback: IRCIMIWSearchConversationsCallback(
      onSuccess: (results) async {
        if (results == null) {
          conversationCompleter.complete();
          return;
        }
        for (var result in results) {
          RCIMIWConversation? con = result.conversation;
          if (con != null) {
            // 抓取对应对话的消息,并构建新的 SearchResult
            var future = () {
              Completer completer = Completer();
              engineProvider.engine?.searchMessages(
                con.conversationType ?? RCIMIWConversationType.invalid,
                con.targetId ?? '',
                con.channelId,
                query,
                DateTime.now().millisecondsSinceEpoch,
                20,
                callback: IRCIMIWSearchMessagesCallback(
                  onSuccess: (messages) {
                    if (messages != null) {
                      for (var msg in messages) {
                        if (msg is RCIMIWTextMessage) {
                          final conversationModel = (con);
                          searchResults.add(SearchResult(
                              message: msg, conversation: conversationModel));
                        }
                      }
                    }
                    completer.complete();
                  },
                  onError: (code) {
                    completer.complete();
                  },
                ),
              );
              return completer.future;
            }();
            searchFutures.add(future);
          }
        }
        conversationCompleter.complete();
      },
      onError: (code) {
        conversationCompleter.complete();
      },
    ),
  );

  await conversationCompleter.future;
  if (searchFutures.isNotEmpty) {
    await Future.wait(searchFutures);
  }
  _results = searchResults;
  notifyListeners();
}