Create a new Isolate to send pictures

main
htylight 2023-09-10 16:45:56 +08:00
parent eda27359af
commit be64a626ce
1 changed files with 118 additions and 45 deletions

View File

@ -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<String> receivers;
final List<String> attachments;
final String dir;
SendMessage(this.type, this.receivers, this.attachments, this.dir);
SendMessage.fromJson(Map<String, dynamic> 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<MessageInputBox> {
'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<UserAccount>().id;
getIt.get<WebSocketManager>().channel.sink.add(json.encode(msg1));
getIt.get<WebSocketManager>().channel.sink.add(json.encode(msg));
if (attachments.isNotEmpty) {
String baseImageDir = getIt.get<UserProfile>().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<WebSocketManager>().channel.sink.add(
json.encode(
{
'event': 'friend-chat-image',
'receiverId': widget.contactId,
'filename': attachments[i],
'bytes': bytes,
},
List<String> encodedDatas = await compute(
bytes2json,
(
0,
[widget.contactId],
attachments,
_imageFileList,
baseImageDir,
),
);
for (final data in encodedDatas) {
getIt.get<WebSocketManager>().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<WebSocketManager>().channel.sink.add(
// json.encode(
// {
// 'event': 'friend-chat-image',
// 'receiverId': widget.contactId,
// 'filename': attachments[i],
// 'bytes': bytes,
// },
// ),
// );
// }
}
} else {
String baseImageDir = getIt.get<UserProfile>().baseImageDir;
List<String> receiverIds = getIt
.get<ContactAccountProfile>()
.groupChats[widget.contactId]!
@ -298,24 +316,38 @@ class _MessageInputBoxState extends State<MessageInputBox> {
msg['receiverIds'] = receiverIds;
getIt.get<WebSocketManager>().channel.sink.add(json.encode(msg));
if (attachments.isNotEmpty) {
String baseImageDir = getIt.get<UserProfile>().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<WebSocketManager>().channel.sink.add(
json.encode(
{
'event': 'group-chat-image',
'groupChatId': widget.contactId,
'receiverIds': receiverIds,
'filename': attachments[i],
'bytes': bytes,
},
List<String> encodedDatas = await compute(
bytes2json,
(
1,
receiverIds,
attachments,
_imageFileList,
baseImageDir,
),
);
for (final data in encodedDatas) {
getIt.get<WebSocketManager>().channel.sink.add(data);
}
// String baseImageDir = getIt.get<UserProfile>().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<WebSocketManager>().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<MessageInputBox> {
}
}
}
Future<List<String>> bytes2json(
(
int,
List<String>,
List<String>,
List<XFile>,
String,
) args) async {
List<String> 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;
}