From be64a626cec6615feec3135ce328f301bde58f72 Mon Sep 17 00:00:00 2001 From: htylight Date: Sun, 10 Sep 2023 16:45:56 +0800 Subject: [PATCH] Create a new Isolate to send pictures --- .../message/components/message_input_box.dart | 163 +++++++++++++----- 1 file changed, 118 insertions(+), 45 deletions(-) diff --git a/lib/screens/message/components/message_input_box.dart b/lib/screens/message/components/message_input_box.dart index 59866bc..520c4b8 100755 --- a/lib/screens/message/components/message_input_box.dart +++ b/lib/screens/message/components/message_input_box.dart @@ -1,7 +1,7 @@ import 'dart:convert'; import 'dart:io'; -import 'dart:typed_data'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:hive_flutter/hive_flutter.dart'; @@ -18,6 +18,21 @@ import 'package:together_mobile/utils/app_dir.dart'; import 'package:together_mobile/utils/format_datetime.dart'; import 'input_icon_button.dart'; +class SendMessage { + final int type; + final List receivers; + final List attachments; + final String dir; + + SendMessage(this.type, this.receivers, this.attachments, this.dir); + + SendMessage.fromJson(Map json) + : type = json['type'], + receivers = json['receivers'], + attachments = json['attachments'], + dir = json['dir']; +} + class MessageInputBox extends StatefulWidget { const MessageInputBox({ super.key, @@ -252,42 +267,45 @@ class _MessageInputBoxState extends State { 'isShowTime': isShowTime, }; - final msg1 = { - 'type': 'text/multipart', - 'senderId': senderId, - 'text': text, - 'attachments': attachments, - 'dateTime': now.toString(), - 'isShowTime': isShowTime, - }; - if (widget.chatType == 0) { msg['event'] = 'friend-chat-msg'; msg['receiverId'] = widget.contactId; - msg1['event'] = 'friend-chat-msg'; - msg1['receiverId'] = getIt.get().id; - getIt.get().channel.sink.add(json.encode(msg1)); getIt.get().channel.sink.add(json.encode(msg)); if (attachments.isNotEmpty) { String baseImageDir = getIt.get().baseImageDir; - for (var i = 0; i < attachments.length; i++) { - Uint8List bytes = await _imageFileList[i].readAsBytes(); - File file = File('$baseImageDir/${attachments[i]}'); - file.createSync(recursive: true); - file.writeAsBytes(bytes); - getIt.get().channel.sink.add( - json.encode( - { - 'event': 'friend-chat-image', - 'receiverId': widget.contactId, - 'filename': attachments[i], - 'bytes': bytes, - }, - ), - ); + List encodedDatas = await compute( + bytes2json, + ( + 0, + [widget.contactId], + attachments, + _imageFileList, + baseImageDir, + ), + ); + + for (final data in encodedDatas) { + getIt.get().channel.sink.add(data); } + // for (var i = 0; i < attachments.length; i++) { + // Uint8List bytes = await _imageFileList[i].readAsBytes(); + // File file = File('$baseImageDir/${attachments[i]}'); + // file.createSync(recursive: true); + // file.writeAsBytes(bytes); + // getIt.get().channel.sink.add( + // json.encode( + // { + // 'event': 'friend-chat-image', + // 'receiverId': widget.contactId, + // 'filename': attachments[i], + // 'bytes': bytes, + // }, + // ), + // ); + // } } } else { + String baseImageDir = getIt.get().baseImageDir; List receiverIds = getIt .get() .groupChats[widget.contactId]! @@ -298,24 +316,38 @@ class _MessageInputBoxState extends State { msg['receiverIds'] = receiverIds; getIt.get().channel.sink.add(json.encode(msg)); if (attachments.isNotEmpty) { - String baseImageDir = getIt.get().baseImageDir; - for (var i = 0; i < attachments.length; i++) { - Uint8List bytes = await _imageFileList[i].readAsBytes(); - File file = File('$baseImageDir/${attachments[i]}'); - file.createSync(recursive: true); - file.writeAsBytes(bytes); - getIt.get().channel.sink.add( - json.encode( - { - 'event': 'group-chat-image', - 'groupChatId': widget.contactId, - 'receiverIds': receiverIds, - 'filename': attachments[i], - 'bytes': bytes, - }, - ), - ); + List encodedDatas = await compute( + bytes2json, + ( + 1, + receiverIds, + attachments, + _imageFileList, + baseImageDir, + ), + ); + + for (final data in encodedDatas) { + getIt.get().channel.sink.add(data); } + // String baseImageDir = getIt.get().baseImageDir; + // for (var i = 0; i < attachments.length; i++) { + // Uint8List bytes = await _imageFileList[i].readAsBytes(); + // File file = File('$baseImageDir/${attachments[i]}'); + // file.createSync(recursive: true); + // file.writeAsBytes(bytes); + // getIt.get().channel.sink.add( + // json.encode( + // { + // 'event': 'group-chat-image', + // 'groupChatId': widget.contactId, + // 'receiverIds': receiverIds, + // 'filename': attachments[i], + // 'bytes': bytes, + // }, + // ), + // ); + // } } } @@ -360,3 +392,44 @@ class _MessageInputBoxState extends State { } } } + +Future> bytes2json( + ( + int, + List, + List, + List, + String, + ) args) async { + List encodedJson = []; + for (var i = 0; i < args.$3.length; i++) { + Uint8List bytes = await args.$4[i].readAsBytes(); + File file = File('${args.$5}/${args.$3[i]}'); + await file.create(recursive: true); + await file.writeAsBytes(bytes); + if (args.$1 == 0) { + encodedJson.add( + json.encode( + { + 'event': 'friend-chat-image', + 'receiverId': args.$2[0], + 'filename': args.$3[i], + 'bytes': bytes, + }, + ), + ); + } else { + encodedJson.add( + json.encode( + { + 'event': 'friend-chat-image', + 'receiverIds': args.$2, + 'filename': args.$3[i], + 'bytes': bytes, + }, + ), + ); + } + } + return encodedJson; +}