diff --git a/lib/http/member.dart b/lib/http/member.dart index e174a2e3c..a69558f7e 100644 --- a/lib/http/member.dart +++ b/lib/http/member.dart @@ -372,8 +372,7 @@ class MemberHttp { queryParameters: params, options: Options(headers: { HttpHeaders.userAgentHeader: Request.headerUa(type: 'pc'), - HttpHeaders.refererHeader: - '${HttpString.spaceBaseUrl}/$mid/search?keyword=$keyword', + HttpHeaders.refererHeader: '${HttpString.spaceBaseUrl}/$mid', 'origin': HttpString.spaceBaseUrl, }), ); diff --git a/lib/http/msg.dart b/lib/http/msg.dart index 185458aa2..53ba7bd09 100644 --- a/lib/http/msg.dart +++ b/lib/http/msg.dart @@ -455,8 +455,11 @@ class MsgHttp { } } - static Future> sessionMsg( - {int? talkerId}) async { + static Future> sessionMsg({ + int? talkerId, + beginSeqno, + endSeqno, + }) async { Map params = await WbiSign.makSign({ 'talker_id': talkerId, 'session_type': 1, @@ -464,6 +467,8 @@ class MsgHttp { 'sender_device_id': 1, 'build': 0, 'mobi_app': 'web', + if (beginSeqno != null) 'begin_seqno': beginSeqno, + if (endSeqno != null) 'end_seqno': endSeqno, }); var res = await Request().get(Api.sessionMsg, queryParameters: params); if (res.data['code'] == 0) { diff --git a/lib/models/msg/session.dart b/lib/models/msg/session.dart index e9b0d84fe..80e2edaab 100644 --- a/lib/models/msg/session.dart +++ b/lib/models/msg/session.dart @@ -170,8 +170,8 @@ class SessionMsgDataModel { List? messages; int? hasMore; - int? minSeqno; - int? maxSeqno; + num? minSeqno; + num? maxSeqno; List? eInfos; SessionMsgDataModel.fromJson(Map json) { diff --git a/lib/pages/whisper_detail/controller.dart b/lib/pages/whisper_detail/controller.dart index 8c1b06c4d..8c72e6bae 100644 --- a/lib/pages/whisper_detail/controller.dart +++ b/lib/pages/whisper_detail/controller.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/pages/common/common_list_controller.dart'; +import 'package:PiliPlus/utils/extension.dart'; import 'package:flutter/material.dart'; import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; import 'package:get/get.dart'; @@ -19,6 +20,8 @@ class WhisperDetailController late String face; String? mid; + int? msgSeqno; + //表情转换图片规则 List? eInfos; @@ -38,7 +41,8 @@ class WhisperDetailController bool isRefresh, Success response) { List? messageList = response.response.messages; if (messageList?.isNotEmpty == true) { - if (messageList!.length == 1 && + msgSeqno = messageList!.last.msgSeqno; + if (messageList.length == 1 && messageList.last.msgType == 18 && messageList.last.msgSource == 18) { // debugPrint(messageList.last); @@ -103,7 +107,7 @@ class WhisperDetailController loadingState.refresh(); SmartDialog.showToast('撤回成功'); } else { - queryData(); + onRefresh(); onClearText(); SmartDialog.showToast('发送成功'); } @@ -114,10 +118,24 @@ class WhisperDetailController @override List? getDataList(SessionMsgDataModel response) { + if (response.hasMore == 0) { + isEnd = true; + } return response.messages; } + @override + Future onRefresh() { + msgSeqno = null; + scrollController.jumpToTop(); + return super.onRefresh(); + } + @override Future> customGetData() => - MsgHttp.sessionMsg(talkerId: talkerId); + MsgHttp.sessionMsg( + talkerId: talkerId, + beginSeqno: msgSeqno != null ? 0 : null, + endSeqno: msgSeqno, + ); } diff --git a/lib/pages/whisper_detail/view.dart b/lib/pages/whisper_detail/view.dart index a287d1352..e439cf36c 100644 --- a/lib/pages/whisper_detail/view.dart +++ b/lib/pages/whisper_detail/view.dart @@ -130,7 +130,12 @@ class _WhisperDetailPageState reverse: true, itemCount: loadingState.response!.length, padding: const EdgeInsets.only(bottom: 12), + physics: const AlwaysScrollableScrollPhysics(), + controller: _whisperDetailController.scrollController, itemBuilder: (context, int index) { + if (index == loadingState.response!.length - 1) { + _whisperDetailController.onLoadMore(); + } final item = loadingState.response![index]; return ChatItem( item: item,