From 00af8b6a9fb7ae140bedb179f32cd1ccdbe1fd0a Mon Sep 17 00:00:00 2001 From: SL Date: Fri, 1 Dec 2023 19:03:47 +0800 Subject: [PATCH] Update channel info refresh listener and optimize data insertion issues --- CHANGELOG.md | 4 +- README.md | 2 +- example/assets/ic_default_avatar.png | Bin 0 -> 6020 bytes example/lib/chat.dart | 2 +- example/lib/home.dart | 8 +- example/lib/http.dart | 2 +- example/lib/im.dart | 10 +- lib/db/channel.dart | 38 ++++---- lib/db/channel_member.dart | 44 +++++---- lib/db/conversation.dart | 42 +++++---- lib/db/message.dart | 136 +++++++++++++++------------ lib/db/reaction.dart | 42 +++++---- lib/db/reminder.dart | 33 ++++--- lib/manager/channel_manager.dart | 5 +- lib/manager/connect_manager.dart | 2 + lib/proto/packet.dart | 3 + lib/proto/proto.dart | 1 - pubspec.yaml | 2 +- 18 files changed, 215 insertions(+), 161 deletions(-) create mode 100644 example/assets/ic_default_avatar.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 6254508..c825cd0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,4 +39,6 @@ ### 1.1.9 * Modify message reply to ack issue and Add protocol device flag field ### 1.2.0 - * Modify query channel message error issue \ No newline at end of file + * Modify query channel message error issue + ### 1.2.1 + * Update channel info refresh listener and optimize data insertion issues \ No newline at end of file diff --git a/README.md b/README.md index 1da8887..ed3dd63 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ #### 安装 ``` dependencies: - wukongimfluttersdk: ^1.2.0 + wukongimfluttersdk: ^1.2.1 ``` #### 引入 ```dart diff --git a/example/assets/ic_default_avatar.png b/example/assets/ic_default_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..2366b7009150e6f037ad3faa57024c4a7b1397d3 GIT binary patch literal 6020 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 literal 0 HcmV?d00001 diff --git a/example/lib/chat.dart b/example/lib/chat.dart index 41d7718..9a91545 100644 --- a/example/lib/chat.dart +++ b/example/lib/chat.dart @@ -59,7 +59,7 @@ class ChatListDataState extends State { void initState() { super.initState(); initListener(); - getMsgList(50000, 0, true); + getMsgList(0, 0, true); } initListener() { diff --git a/example/lib/home.dart b/example/lib/home.dart index 1fae5c9..db1b66a 100644 --- a/example/lib/home.dart +++ b/example/lib/home.dart @@ -49,11 +49,13 @@ class ListViewShowDataState extends State { if (status == WKConnectStatus.connecting) { _connectionStatusStr = '连接中...'; } else if (status == WKConnectStatus.success) { - _connectionStatusStr = '最近会话'; + _connectionStatusStr = '最近会话【连接成功】'; } else if (status == WKConnectStatus.noNetwork) { _connectionStatusStr = '网络异常'; } else if (status == WKConnectStatus.syncMsg) { _connectionStatusStr = '同步消息中...'; + } else if (status == WKConnectStatus.kicked) { + _connectionStatusStr = '未连接,在其他设备登录'; } setState(() {}); }); @@ -163,6 +165,10 @@ class ListViewShowDataState extends State { height: 200, width: 200, fit: BoxFit.cover, + errorBuilder: (BuildContext context, Object exception, + StackTrace? stackTrace) { + return Image.asset('assets/ic_default_avatar.png'); + }, ), ), Expanded( diff --git a/example/lib/http.dart b/example/lib/http.dart index 05e5d2d..08e3ebc 100644 --- a/example/lib/http.dart +++ b/example/lib/http.dart @@ -40,7 +40,7 @@ class HttpUtils { lastSsgSeqs, // 客户端所有频道会话的最后一条消息序列号拼接出来的同步串 格式: channelID:channelType:last_msg_seq|channelID:channelType:last_msg_seq (此字段非必填,如果不填就获取全量数据,填写了获取增量数据,看你自己的需求。) "msg_count": 10 // 每个会话获取最大的消息数量,一般为app点进去第一屏的数据 }); - print(response.data); + // print(response.data); WKSyncConversation conversation = WKSyncConversation(); conversation.conversations = []; if (response.statusCode == HttpStatus.ok) { diff --git a/example/lib/im.dart b/example/lib/im.dart index 9c27bbe..23c00f6 100644 --- a/example/lib/im.dart +++ b/example/lib/im.dart @@ -32,7 +32,14 @@ class IMUtils { "https://lmg.jj20.com/up/allimg/tx30/10121138219844229.jpg", "https://lmg.jj20.com/up/allimg/tx30/10121138219844229.jpg", "https://lmg.jj20.com/up/allimg/tx28/430423183653303.jpg", - "https://lmg.jj20.com/up/allimg/tx23/520420024834916.jpg" + "https://lmg.jj20.com/up/allimg/tx23/520420024834916.jpg", + "https://himg.bdimg.com/sys/portraitn/item/public.1.a535a65d.tJe8MgWmP8zJ456B73Kzfg", + "https://images.liqucn.com/img/h23/h07/img_localize_cb7b78b88d5b33e2ce8921221bf3deae_400x400.png", + "https://img1.baidu.com/it/u=3916753633,2634890492&fm=253&fmt=auto&app=138&f=JPEG?w=400&h=400", + "https://img0.baidu.com/it/u=4210586523,443489101&fm=253&fmt=auto&app=138&f=JPEG?w=304&h=304", + "https://img2.baidu.com/it/u=2559320899,1546883787&fm=253&fmt=auto&app=138&f=JPEG?w=441&h=499", + "https://img0.baidu.com/it/u=2952429745,3806929819&fm=253&fmt=auto&app=138&f=JPEG?w=380&h=380", + "https://img2.baidu.com/it/u=3783923022,668713258&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500", ]; WKIM.shared.messageManager.addOnSyncChannelMsgListener((channelID, @@ -44,6 +51,7 @@ class IMUtils { // 获取channel资料 WKIM.shared.channelManager .addOnGetChannelListener((channelId, channelType, back) { + print('获取channel资料'); if (channelType == WKChannelType.personal) { // 获取个人资料 // 这里直接返回了。实际情况可通过API请求后返回 diff --git a/lib/db/channel.dart b/lib/db/channel.dart index c561f30..6773a9e 100644 --- a/lib/db/channel.dart +++ b/lib/db/channel.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'dart:convert'; +import 'package:sqflite/sqflite.dart'; import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/entity/channel.dart'; @@ -12,11 +13,11 @@ class ChannelDB { static ChannelDB get shared => _instance; Future query(String channelID, int channelType) async { - String sql = - "select * from ${WKDBConst.tableChannel} where channel_id='$channelID' and channel_type=$channelType"; WKChannel? channel; - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared.getDB().query( + WKDBConst.tableChannel, + where: "channel_id=? and channel_type=?", + whereArgs: [channelID, channelType]); if (list.isNotEmpty) { channel = WKDBConst.serializeChannel(list[0]); } @@ -44,8 +45,8 @@ class ChannelDB { if (updateList.isNotEmpty) { for (Map value in updateList) { txn.update(WKDBConst.tableChannel, value, - where: - "channel_id='${value['channel_id']}' and channel_type=${value['channel_type']}"); + where: "channel_id=? and channel_type=?", + whereArgs: [value['channel_id'], value['channel_type']]); } } }); @@ -62,26 +63,27 @@ class ChannelDB { } insert(WKChannel channel) { - WKDBHelper.shared.getDB().insert(WKDBConst.tableChannel, getMap(channel)); + WKDBHelper.shared.getDB().insert(WKDBConst.tableChannel, getMap(channel), + conflictAlgorithm: ConflictAlgorithm.replace); } update(WKChannel channel) { WKDBHelper.shared.getDB().update(WKDBConst.tableChannel, getMap(channel), - where: - "channel_id='${channel.channelID}' and channel_type=${channel.channelType}"); + where: "channel_id=? and channel_type=?", + whereArgs: [channel.channelID, channel.channelType]); } Future isExist(String channelID, int channelType) async { bool isExit = false; - String sql = - "select * from ${WKDBConst.tableChannel} where channel_id='$channelID' and channel_type=$channelType"; - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared.getDB().query( + WKDBConst.tableChannel, + where: "channel_id=? and channel_type=?", + whereArgs: [channelID, channelType]); if (list.isNotEmpty) { dynamic data = list[0]; if (data != null) { String channelID = WKDBConst.readString(data, 'channel_id'); - if (channelID != '' && channelID.isNotEmpty) { + if (channelID != '') { isExit = true; } } @@ -104,11 +106,11 @@ class ChannelDB { sb.write("'"); } String channelIds = sb.toString(); - String sql = - "select * from ${WKDBConst.tableChannel} where channel_id in ($channelIds) and channel_type=$channelType"; List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableChannel, + where: "channel_id in (?) and channel_type=?", + whereArgs: [channelIds, channelType]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeChannel(data)); diff --git a/lib/db/channel_member.dart b/lib/db/channel_member.dart index 599d2c7..e9e1f0e 100644 --- a/lib/db/channel_member.dart +++ b/lib/db/channel_member.dart @@ -1,3 +1,5 @@ +import 'package:sqflite/sqflite.dart'; + import '../entity/channel_member.dart'; import 'const.dart'; import 'wk_db_helper.dart'; @@ -21,11 +23,11 @@ class ChannelMemberDB { sb.write(uidList[i]); sb.write("'"); } - String sql = - "select * from ${WKDBConst.tableChannelMember} where channel_id='$channelID' and channel_type=$channelType and member_uid in (${sb.toString()})"; List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableChannelMember, + where: "channel_id=? and channel_type=? and member_uid in (?)", + whereArgs: [channelID, channelType, sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeChannelMember(data)); @@ -36,11 +38,11 @@ class ChannelMemberDB { Future getMaxVersion(String channelID, int channelType) async { String sql = - "select max(version) version from ${WKDBConst.tableChannelMember} where channel_id ='$channelID' and channel_type=$channelType limit 0, 1"; + "select max(version) version from ${WKDBConst.tableChannelMember} where channel_id =? and channel_type=? limit 0, 1"; int version = 0; List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]); if (results.isNotEmpty) { dynamic data = results[0]; version = WKDBConst.readInt(data, 'version'); @@ -51,10 +53,11 @@ class ChannelMemberDB { Future queryWithUID( String channelId, int channelType, String memberUID) async { String sql = - "select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} left join ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid = ${WKDBConst.tableChannel}.channel_id AND ${WKDBConst.tableChannel}.channel_type=1 where (${WKDBConst.tableChannelMember}.channel_id='$channelId' and ${WKDBConst.tableChannelMember}.channel_type=$channelType and ${WKDBConst.tableChannelMember}.member_uid='$memberUID')"; + "select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} left join ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid = ${WKDBConst.tableChannel}.channel_id AND ${WKDBConst.tableChannel}.channel_type=1 where (${WKDBConst.tableChannelMember}.channel_id=? and ${WKDBConst.tableChannelMember}.channel_type=? and ${WKDBConst.tableChannelMember}.member_uid=?)"; WKChannelMember? channelMember; - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared + .getDB() + .rawQuery(sql, [channelId, channelType, memberUID]); if (list.isNotEmpty) { channelMember = WKDBConst.serializeChannelMember(list[0]); } @@ -64,10 +67,10 @@ class ChannelMemberDB { Future?> queryWithChannel( String channelId, int channelType) async { String sql = - "select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} LEFT JOIN ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid=${WKDBConst.tableChannel}.channel_id and ${WKDBConst.tableChannel}.channel_type=1 where ${WKDBConst.tableChannelMember}.channel_id='$channelId' and ${WKDBConst.tableChannelMember}.channel_type=$channelType and ${WKDBConst.tableChannelMember}.is_deleted=0 and ${WKDBConst.tableChannelMember}.status=1 order by ${WKDBConst.tableChannelMember}.role=1 desc,${WKDBConst.tableChannelMember}.role=2 desc,${WKDBConst.tableChannelMember}.created_at asc"; + "select ${WKDBConst.tableChannelMember}.*,$channelCols from ${WKDBConst.tableChannelMember} LEFT JOIN ${WKDBConst.tableChannel} on ${WKDBConst.tableChannelMember}.member_uid=${WKDBConst.tableChannel}.channel_id and ${WKDBConst.tableChannel}.channel_type=1 where ${WKDBConst.tableChannelMember}.channel_id=? and ${WKDBConst.tableChannelMember}.channel_type=? and ${WKDBConst.tableChannelMember}.is_deleted=0 and ${WKDBConst.tableChannelMember}.status=1 order by ${WKDBConst.tableChannelMember}.role=1 desc,${WKDBConst.tableChannelMember}.role=2 desc,${WKDBConst.tableChannelMember}.created_at asc"; List list = []; List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [channelId, channelType]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeChannelMember(data)); @@ -88,11 +91,11 @@ class ChannelMemberDB { sb.write("'"); } - String sql = - "select * from ${WKDBConst.tableChannelMember} where channel_id ='$channelID' and channel_type=$channelType and member_uid in (${sb.toString()})"; List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableChannelMember, + where: "channel_id=? and channel_type=? and member_uid in (?) ", + whereArgs: [channelID, channelType, sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeChannelMember(data)); @@ -122,15 +125,20 @@ class ChannelMemberDB { WKDBHelper.shared.getDB().transaction((txn) async { if (insertCVList.isNotEmpty) { for (Map value in insertCVList) { - txn.insert(WKDBConst.tableChannelMember, value); + txn.insert(WKDBConst.tableChannelMember, value, + conflictAlgorithm: ConflictAlgorithm.replace); } } if (updateCVList.isNotEmpty) { for (Map value in updateCVList) { txn.update(WKDBConst.tableChannelMember, value, - where: - "channel_id='${value['channel_id']}' and channel_type=${value['channel_type']} and member_uid='${value['member_uid']}'"); + where: "channel_id=? and channel_type=? and member_uid=?", + whereArgs: [ + value['channel_id'], + value['channel_type'], + value['member_uid'] + ]); } } }); diff --git a/lib/db/conversation.dart b/lib/db/conversation.dart index 514c9dd..d431468 100644 --- a/lib/db/conversation.dart +++ b/lib/db/conversation.dart @@ -1,7 +1,9 @@ import 'dart:collection'; import 'dart:convert'; +import 'package:sqflite/sqflite.dart'; import 'package:wukongimfluttersdk/db/const.dart'; +import 'package:wukongimfluttersdk/entity/channel.dart'; import '../entity/conversation.dart'; import 'wk_db_helper.dart'; @@ -24,7 +26,10 @@ class ConversationDB { if (results.isNotEmpty) { for (Map data in results) { WKConversationMsg msg = WKDBConst.serializeCoversation(data); - list.add(getUIMsg(msg)); + WKChannel wkChannel = WKDBConst.serializeChannel(data); + WKUIConversationMsg uiMsg = getUIMsg(msg); + uiMsg.setWkChannel(wkChannel); + list.add(uiMsg); } } return list; @@ -35,7 +40,8 @@ class ConversationDB { data['is_deleted'] = 1; int row = await WKDBHelper.shared.getDB().update( WKDBConst.tableConversation, data, - where: "channel_id='$channelID' and channel_type=$channelType"); + where: "channel_id=? and channel_type=?", + whereArgs: [channelID, channelType]); return row > 0; } @@ -46,9 +52,9 @@ class ConversationDB { conversationMsg.channelID, conversationMsg.channelType); if (lastMsg == null || lastMsg.channelID.isEmpty) { - row = await WKDBHelper.shared - .getDB() - .insert(WKDBConst.tableConversation, getMap(conversationMsg, false)); + row = await WKDBHelper.shared.getDB().insert( + WKDBConst.tableConversation, getMap(conversationMsg, false), + conflictAlgorithm: ConflictAlgorithm.replace); } else { conversationMsg.unreadCount = lastMsg.unreadCount + conversationMsg.unreadCount; @@ -66,11 +72,11 @@ class ConversationDB { Future queryMsgByMsgChannelId( String channelId, int channelType) async { WKConversationMsg? msg; - String sql = - "select * from ${WKDBConst.tableConversation} where channel_id='$channelId' and channel_type=$channelType"; - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared.getDB().query( + WKDBConst.tableConversation, + where: "channel_id=? and channel_type=?", + whereArgs: [channelId, channelType]); if (list.isNotEmpty) { msg = WKDBConst.serializeCoversation(list[0]); } @@ -116,11 +122,11 @@ class ConversationDB { sb.write(channelIds[i]); sb.write("'"); } - String sql = - "select * from '${WKDBConst.tableConversation}' where channel_id in (${sb.toString()})"; List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableConversation, + where: "channel_id in (?)", + whereArgs: [sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeCoversation(data)); @@ -160,14 +166,15 @@ class ConversationDB { WKDBHelper.shared.getDB().transaction((txn) async { if (insertList.isNotEmpty) { for (int i = 0; i < insertList.length; i++) { - txn.insert(WKDBConst.tableConversation, insertList[i]); + txn.insert(WKDBConst.tableConversation, insertList[i], + conflictAlgorithm: ConflictAlgorithm.replace); } } if (updateList.isNotEmpty) { for (Map value in updateList) { txn.update(WKDBConst.tableConversation, value, - where: - "channel_id='${value['channel_id']}' and channel_type=${value['channel_type']}"); + where: "channel_id=? and channel_type=?", + whereArgs: [value['channel_id'], value['channel_type']]); } } }); @@ -196,7 +203,8 @@ class ConversationDB { dynamic map, String channelID, int channelType) async { return await WKDBHelper.shared.getDB().update( WKDBConst.tableConversation, map, - where: "channel_id='$channelID' and channel_type=$channelType"); + where: "channel_id=? and channel_type=?", + whereArgs: [channelID, channelType]); } WKUIConversationMsg getUIMsg(WKConversationMsg conversationMsg) { diff --git a/lib/db/message.dart b/lib/db/message.dart index bb69952..5c53349 100644 --- a/lib/db/message.dart +++ b/lib/db/message.dart @@ -1,5 +1,6 @@ import 'dart:convert'; +import 'package:sqflite/sqflite.dart'; import 'package:wukongimfluttersdk/db/channel.dart'; import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/db/reaction.dart'; @@ -23,10 +24,10 @@ class MessageDB { Future isExist(String clientMsgNo) async { bool isExist = false; - String sql = - "select * from ${WKDBConst.tableMessage} where client_msg_no='$clientMsgNo'"; - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared.getDB().query( + WKDBConst.tableMessage, + where: "client_msg_no=?", + whereArgs: [clientMsgNo]); if (list.isNotEmpty) { isExist = true; } @@ -45,36 +46,35 @@ class MessageDB { msg.clientMsgNO = WKIM.shared.messageManager.generateClientMsgNo(); } } - return await WKDBHelper.shared - .getDB() - .insert(WKDBConst.tableMessage, getMap(msg)); + return await WKDBHelper.shared.getDB().insert( + WKDBConst.tableMessage, getMap(msg), + conflictAlgorithm: ConflictAlgorithm.replace); } Future updateMsg(WKMsg msg) async { return await WKDBHelper.shared.getDB().update( WKDBConst.tableMessage, getMap(msg), - where: "client_seq=${msg.clientSeq}"); + where: "client_seq=?", whereArgs: [msg.clientSeq]); } Future updateMsgWithField(dynamic map, int clientSeq) async { - return await WKDBHelper.shared - .getDB() - .update(WKDBConst.tableMessage, map, where: "client_seq=$clientSeq"); + return await WKDBHelper.shared.getDB().update(WKDBConst.tableMessage, map, + where: "client_seq=?", whereArgs: [clientSeq]); } Future updateMsgWithFieldAndClientMsgNo( dynamic map, String clientMsgNO) async { return await WKDBHelper.shared.getDB().update(WKDBConst.tableMessage, map, - where: "client_msg_no='$clientMsgNO'"); + where: "client_msg_no=?", whereArgs: [clientMsgNO]); } Future queryWithClientMsgNo(String clientMsgNo) async { WKMsg? wkMsg; String sql = - "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_msg_no='$clientMsgNo'"; + "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_msg_no=?"; List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [clientMsgNo]); if (list.isNotEmpty) { wkMsg = WKDBConst.serializeWKMsg(list[0]); } @@ -88,10 +88,10 @@ class MessageDB { Future queryWithClientSeq(int clientSeq) async { WKMsg? wkMsg; String sql = - "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_seq=$clientSeq"; + "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.client_seq=?"; List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [clientSeq]); if (list.isNotEmpty) { wkMsg = WKDBConst.serializeWKMsg(list[0]); } @@ -114,10 +114,10 @@ class MessageDB { } String sql = - "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.message_id in (${sb.toString()})"; + "select $messageCols,$extraCols from ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} ON ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.message_id in (?)"; List list = []; List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeWKMsg(data)); @@ -129,9 +129,9 @@ class MessageDB { Future queryMaxOrderSeq(String channelID, int channelType) async { int maxOrderSeq = 0; String sql = - "select max(order_seq) order_seq from ${WKDBConst.tableMessage} where channel_id ='$channelID' and channel_type=$channelType and type<>99 and type<>0 and is_deleted=0"; + "select max(order_seq) order_seq from ${WKDBConst.tableMessage} where channel_id =? and channel_type=? and type<>99 and type<>0 and is_deleted=0"; List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]); if (list.isNotEmpty) { dynamic data = list[0]; maxOrderSeq = WKDBConst.readInt(data, 'order_seq'); @@ -141,10 +141,10 @@ class MessageDB { Future getMaxMessageSeq(String channelID, int channelType) async { String sql = - "SELECT max(message_seq) message_seq FROM ${WKDBConst.tableMessage} WHERE channel_id='$channelID' AND channel_type=$channelType"; + "SELECT max(message_seq) message_seq FROM ${WKDBConst.tableMessage} WHERE channel_id=? AND channel_type=?"; int messageSeq = 0; List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]); if (list.isNotEmpty) { dynamic data = list[0]; messageSeq = WKDBConst.readInt(data, 'message_seq'); @@ -156,9 +156,10 @@ class MessageDB { String channelID, int channelType, int maxOrderSeq, int limit) async { int minOrderSeq = 0; String sql = - "select order_seq from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type='$channelType' and type<>99 and order_seq <= $maxOrderSeq order by order_seq desc limit $limit"; - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + "select order_seq from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and type<>99 and order_seq <=? order by order_seq desc limit ?"; + List> list = await WKDBHelper.shared + .getDB() + .rawQuery(sql, [channelID, channelType, maxOrderSeq, limit]); if (list.isNotEmpty) { dynamic data = list[0]; minOrderSeq = WKDBConst.readInt(data, 'order_seq'); @@ -170,34 +171,41 @@ class MessageDB { int oldestOrderSeq, bool contain, int pullMode, int limit) async { List msgList = []; String sql; - + var args = []; if (oldestOrderSeq <= 0) { sql = - "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,$limit"; + "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?"; + args.add(channelId); + args.add(channelType); + args.add(limit); } else { if (pullMode == 0) { if (contain) { sql = - "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<=$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,$limit"; + "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?"; } else { sql = - "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq<$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,$limit"; + "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>=$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,$limit"; + "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?"; } else { sql = - "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id='$channelId' and ${WKDBConst.tableMessage}.channel_type=$channelType and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>$oldestOrderSeq) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,$limit"; + "SELECT * FROM (SELECT $messageCols,$extraCols FROM ${WKDBConst.tableMessage} LEFT JOIN ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id=${WKDBConst.tableMessageExtra}.message_id WHERE ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 AND ${WKDBConst.tableMessage}.order_seq>?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?"; } } + args.add(channelId); + args.add(channelType); + args.add(oldestOrderSeq); + args.add(limit); } List messageIds = []; List replyMsgIds = []; List fromUIDs = []; List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, args); if (results.isNotEmpty) { WKChannel? wkChannel = @@ -468,10 +476,11 @@ class MessageDB { Future getDeletedCount(int minMessageSeq, int maxMessageSeq, String channelID, int channelType) async { String sql = - "select count(*) num from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and message_seq>$minMessageSeq and message_seq<$maxMessageSeq and is_deleted=1"; + "select count(*) num from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and message_seq>? and message_seq> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared + .getDB() + .rawQuery(sql, [channelID, channelType, minMessageSeq, maxMessageSeq]); if (list.isNotEmpty) { dynamic data = list[0]; num = WKDBConst.readInt(data, 'num'); @@ -485,14 +494,15 @@ class MessageDB { int messageSeq = 0; if (pullMode == 1) { sql = - "select message_seq from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and order_seq>$oldestOrderSeq and message_seq<>0 order by message_seq desc limit 1"; + "select message_seq from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and order_seq>? and message_seq<>0 order by message_seq desc limit 1"; } else { sql = - "select message_seq from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and order_seq<$oldestOrderSeq and message_seq<>0 order by message_seq asc limit 1"; + "select message_seq from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and order_seq0 order by message_seq asc limit 1"; } - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared + .getDB() + .rawQuery(sql, [channelID, channelType, oldestOrderSeq]); if (list.isNotEmpty) { dynamic data = list[0]; messageSeq = WKDBConst.readInt(data, 'message_seq'); @@ -563,7 +573,8 @@ class MessageDB { if (cvList.isNotEmpty) { WKDBHelper.shared.getDB().transaction((txn) async { for (int i = 0; i < cvList.length; i++) { - txn.insert(WKDBConst.tableMessage, cvList[i]); + txn.insert(WKDBConst.tableMessage, cvList[i], + conflictAlgorithm: ConflictAlgorithm.replace); } }); } @@ -572,8 +583,7 @@ class MessageDB { Future> queryWithClientMsgNos(List clientMsgNos) async { List msgs = []; StringBuffer sb = StringBuffer(); - sb.write( - "select * from ${WKDBConst.tableMessage} where client_msg_no in ("); + for (int i = 0, size = clientMsgNos.length; i < size; i++) { if (i != 0) { sb.write(","); @@ -582,10 +592,11 @@ class MessageDB { sb.write(clientMsgNos[i]); sb.write("'"); } - sb.write(")"); - List> results = - await WKDBHelper.shared.getDB().rawQuery(sb.toString()); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableMessage, + where: "client_msg_no in (?)", + whereArgs: [sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { msgs.add(WKDBConst.serializeWKMsg(data)); @@ -621,12 +632,14 @@ class MessageDB { WKDBHelper.shared.getDB().transaction((txn) async { if (insertCVList.isNotEmpty) { for (int i = 0; i < insertCVList.length; i++) { - txn.insert(WKDBConst.tableMessageExtra, insertCVList[0]); + txn.insert(WKDBConst.tableMessageExtra, insertCVList[0], + conflictAlgorithm: ConflictAlgorithm.replace); } if (updateCVList.isNotEmpty) { for (int i = 0; i < updateCVList.length; i++) { txn.update(WKDBConst.tableMessageExtra, updateCVList[0], - where: "message_id='${updateCVList[i]['message_id']}'"); + where: "message_id=?", + whereArgs: [updateCVList[i]['message_id']]); } } } @@ -639,9 +652,9 @@ class MessageDB { String channelID, int channelType) async { int extraVersion = 0; String sql = - "select max(extra_version) extra_version from ${WKDBConst.tableMessageExtra} where channel_id ='$channelID' and channel_type=$channelType"; + "select max(extra_version) extra_version from ${WKDBConst.tableMessageExtra} where channel_id =? and channel_type=?"; List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]); if (list.isNotEmpty) { dynamic data = list[0]; extraVersion = WKDBConst.readInt(data, 'extra_version'); @@ -651,10 +664,10 @@ class MessageDB { Future> queryMsgExtraWithNeedUpload(int needUpload) async { String sql = - "select * from ${WKDBConst.tableMessageExtra} where needUpload=$needUpload"; + "select * from ${WKDBConst.tableMessageExtra} where need_upload=?"; List list = []; List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [needUpload]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeMsgExtra(data)); @@ -666,10 +679,10 @@ class MessageDB { Future queryMsgExtraWithMsgID(String messageID) async { WKMsgExtra? msgExtra; - String sql = - "select * from ${WKDBConst.tableMessageExtra} where message_id='$messageID'"; - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared.getDB().query( + WKDBConst.tableMessageExtra, + where: "message_id=?", + whereArgs: [messageID]); if (list.isNotEmpty) { msgExtra = WKDBConst.serializeMsgExtra(list[0]); } @@ -678,8 +691,6 @@ class MessageDB { Future> queryMsgExtrasWithMsgIds(List msgIds) async { StringBuffer sb = StringBuffer(); - sb.write( - "select * from ${WKDBConst.tableMessageExtra} where message_id in ("); for (int i = 0, size = msgIds.length; i < size; i++) { if (i != 0) { sb.write(","); @@ -688,10 +699,11 @@ class MessageDB { sb.write(msgIds[i]); sb.write("'"); } - sb.write(")"); List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sb.toString()); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableMessageExtra, + where: "message_id in (?)", + whereArgs: [sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeMsgExtra(data)); @@ -713,9 +725,9 @@ class MessageDB { String channelID, int channelType) async { WKMsg? wkMsg; String sql = - "select * from ${WKDBConst.tableMessage} where channel_id='$channelID' and channel_type=$channelType and is_deleted=0 and type<>0 and type<>99 order by order_seq desc limit 1"; + "select * from ${WKDBConst.tableMessage} where channel_id=? and channel_type=? and is_deleted=0 and type<>0 and type<>99 order by order_seq desc limit 1"; List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]); if (list.isNotEmpty) { dynamic data = list[0]; if (data != null) { diff --git a/lib/db/reaction.dart b/lib/db/reaction.dart index d949e81..954a67f 100644 --- a/lib/db/reaction.dart +++ b/lib/db/reaction.dart @@ -1,3 +1,4 @@ +import 'package:sqflite/sqflite.dart'; import 'package:wukongimfluttersdk/entity/msg.dart'; import 'const.dart'; @@ -10,11 +11,11 @@ class ReactionDB { Future queryMaxSeqWithChannel(String channelID, int channelType) async { String sql = - "select max(seq) seq from ${WKDBConst.tableMessageReaction} where channel_id='$channelID' and channel_type=$channelType limit 0, 1"; + "select max(seq) seq from ${WKDBConst.tableMessageReaction} where channel_id=? and channel_type=? limit 0, 1"; int version = 0; List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + await WKDBHelper.shared.getDB().rawQuery(sql, [channelID, channelType]); if (list.isNotEmpty) { dynamic data = list[0]; if (data != null) { @@ -25,12 +26,12 @@ class ReactionDB { } Future> queryWithMessageId(String messageId) async { - String sql = - "select * from ${WKDBConst.tableMessageReaction} where message_id='$messageId' and is_deleted=0 ORDER BY created_at desc"; List list = []; - - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableMessageReaction, + where: "message_id=? and is_deleted=0", + whereArgs: [messageId], + orderBy: "created_at desc"); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeMsgReation(data)); @@ -51,11 +52,12 @@ class ReactionDB { sb.write("'"); } - String sql = - "select * from ${WKDBConst.tableMessageReaction} where message_id in (${sb.toString()}) and is_deleted=0 ORDER BY created_at desc"; List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableMessageReaction, + where: "message_id in (?) and is_deleted=0", + whereArgs: [sb.toString()], + orderBy: "created_at desc"); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeMsgReation(data)); @@ -86,22 +88,22 @@ class ReactionDB { map['seq'] = reaction.seq; map['emoji'] = reaction.emoji; WKDBHelper.shared.getDB().update(WKDBConst.tableMessageReaction, map, - where: "message_id='${reaction.messageID}' and uid='${reaction.uid}'"); + where: "message_id=? and uid=?", + whereArgs: [reaction.messageID, reaction.uid]); } insertReaction(WKMsgReaction reaction) { - WKDBHelper.shared - .getDB() - .insert(WKDBConst.tableMessageReaction, getReactionMap(reaction)); + WKDBHelper.shared.getDB().insert( + WKDBConst.tableMessageReaction, getReactionMap(reaction), + conflictAlgorithm: ConflictAlgorithm.replace); } Future isExistReaction(String uid, String messageID) async { bool isExist = false; - String sql = - "select * from ${WKDBConst.tableMessageReaction} where message_id='$messageID' and uid='$uid' "; - - List> list = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> list = await WKDBHelper.shared.getDB().query( + WKDBConst.tableMessageReaction, + where: "message_id=? and uid=?", + whereArgs: [messageID, uid]); if (list.isNotEmpty) { isExist = true; } diff --git a/lib/db/reminder.dart b/lib/db/reminder.dart index 2047f09..432af13 100644 --- a/lib/db/reminder.dart +++ b/lib/db/reminder.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'dart:convert'; +import 'package:sqflite/sqflite.dart'; import 'package:wukongimfluttersdk/db/const.dart'; import 'package:wukongimfluttersdk/db/conversation.dart'; import 'package:wukongimfluttersdk/db/wk_db_helper.dart'; @@ -32,12 +33,12 @@ class ReminderDB { Future> queryWithChannel( String channelID, int channelType, int done) async { - String sql = - "select * from ${WKDBConst.tableReminders} where channel_id='$channelID' and channel_type=$channelType and done=$done order by message_seq desc"; List list = []; - - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableReminders, + where: "channel_id=? and channel_type=? and done=?", + whereArgs: [channelID, channelType, done], + orderBy: "message_seq desc"); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeReminder(data)); @@ -84,7 +85,8 @@ class ReminderDB { WKDBHelper.shared.getDB().transaction((txn) async { if (addList.isNotEmpty) { for (Map value in addList) { - txn.insert(WKDBConst.tableReminders, value); + txn.insert(WKDBConst.tableReminders, value, + conflictAlgorithm: ConflictAlgorithm.replace); } } if (updateList.isNotEmpty) { @@ -119,16 +121,17 @@ class ReminderDB { StringBuffer sb = StringBuffer(); for (int i = 0, size = channelIds.length; i < size; i++) { if (i != 0) { - sb.write("'"); + sb.write(","); } + sb.write("'"); sb.write(channelIds[i]); sb.write("'"); } - String sql = - "select * from ${WKDBConst.tableReminders} where channel_id in (${sb.toString()})"; List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableReminders, + where: "channel_id in (?)", + whereArgs: [sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeReminder(data)); @@ -145,11 +148,11 @@ class ReminderDB { } sb.write(ids[i]); } - String sql = - "select * from ${WKDBConst.tableReminders} where reminder_id in (${sb.toString()})"; List list = []; - List> results = - await WKDBHelper.shared.getDB().rawQuery(sql); + List> results = await WKDBHelper.shared.getDB().query( + WKDBConst.tableReminders, + where: "reminder_id in (?)", + whereArgs: [sb.toString()]); if (results.isNotEmpty) { for (Map data in results) { list.add(WKDBConst.serializeReminder(data)); diff --git a/lib/manager/channel_manager.dart b/lib/manager/channel_manager.dart index 920d46a..9d81e9d 100644 --- a/lib/manager/channel_manager.dart +++ b/lib/manager/channel_manager.dart @@ -16,9 +16,8 @@ class WKChannelManager { fetchChannelInfo(String channelID, int channelType) { if (_getChannelInfoBack != null) { - _getChannelInfoBack!(channelID, channelType, (liMChannel) { - addOrUpdateChannel(liMChannel); - ChannelDB.shared.saveOrUpdate(liMChannel); + _getChannelInfoBack!(channelID, channelType, (wkChannel) { + addOrUpdateChannel(wkChannel); }); } } diff --git a/lib/manager/connect_manager.dart b/lib/manager/connect_manager.dart index 9189522..78b931d 100644 --- a/lib/manager/connect_manager.dart +++ b/lib/manager/connect_manager.dart @@ -233,6 +233,7 @@ class WKConnectionManager { _decodePacket(Uint8List data) { var packet = WKIM.shared.options.proto.decode(data); Logs.debug('解码出包->$packet'); + Logs.debug('解码出包类型->${packet.header.packetType}'); if (packet.header.packetType == PacketType.connack) { var connackPacket = packet as ConnackPacket; if (connackPacket.reasonCode == 1) { @@ -276,6 +277,7 @@ class WKConnectionManager { } _closeAll() { + _isLogout = true; WKIM.shared.options.uid = ''; WKIM.shared.options.token = ''; WKIM.shared.messageManager.updateSendingMsgFail(); diff --git a/lib/proto/packet.dart b/lib/proto/packet.dart index a5de955..a89d745 100644 --- a/lib/proto/packet.dart +++ b/lib/proto/packet.dart @@ -131,6 +131,9 @@ class RecvPacket extends Packet { class DisconnectPacket extends Packet { int reasonCode = 0; String reason = ""; + DisconnectPacket() { + header.packetType = PacketType.disconnect; + } } class PingPacket extends Packet { diff --git a/lib/proto/proto.dart b/lib/proto/proto.dart index 7670c32..8c82120 100644 --- a/lib/proto/proto.dart +++ b/lib/proto/proto.dart @@ -171,7 +171,6 @@ Uint8List encodeSend(SendPacket packet) { Uint8List encodeRecvAck(RecvAckPacket packet) { WriteData write = WriteData(); - print("发送ack ${packet.messageID}"); write.writeUint64(packet.messageID); write.writeUint32(packet.messageSeq); return write.toUint8List(); diff --git a/pubspec.yaml b/pubspec.yaml index 6e3ba9f..152c13c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,7 +15,7 @@ description: wukong IM flutter sdk # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. -version: 1.2.0 +version: 1.2.1 homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK environment: