image.dart 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import 'dart:typed_data';
  2. import 'package:dio/dio.dart';
  3. import 'package:get/get.dart';
  4. import 'package:trackoffical_app/service/api.dart';
  5. import '../logger.dart';
  6. import '../model/cache_image.dart';
  7. import '../model/m_net_image.dart';
  8. import 'database.dart';
  9. import '../appcore/ffi.dart' as ffi;
  10. extension NetImageExtension on MNetImage{
  11. Future<Uint8List> loadMemory({ProgressCallback? onReceiveProgress}) async{
  12. if(md5.isEmpty){
  13. return Uint8List(0);
  14. }
  15. if (data != null){
  16. return data!;
  17. }
  18. final db = Get.find<DatabaseService>();
  19. CacheImage? dbImage;
  20. final md5Hex = this.md5Hex;
  21. if(md5Hex != null){
  22. try{
  23. dbImage = await db.getImage(md5Hex);
  24. }catch(e){
  25. warn('加载缓存图片失败:', e);
  26. }
  27. }
  28. if (dbImage != null){
  29. data = Uint8List.fromList(dbImage.image);
  30. timestamp = dbImage.timestamp;
  31. ext=dbImage.ext??'';
  32. nonce=Uint8List.fromList(dbImage.nonce);
  33. onReceiveProgress?.call(1, 1);
  34. }else{
  35. if(url.isEmpty){
  36. final image = await ApiService.to.getBinByMd5(md5, onReceiveProgress??(a, b){});
  37. ext=image.ext;
  38. data = image.data;
  39. nonce=image.nonce;
  40. }else{
  41. final r = await Dio()
  42. .get<Uint8List>(
  43. url,
  44. options: Options(responseType: ResponseType.bytes), //设置接收类型为二进制数组
  45. onReceiveProgress: onReceiveProgress
  46. );
  47. if (r.data != null){
  48. data = r.data;
  49. }else{
  50. data = Uint8List(0);
  51. }
  52. }
  53. if(data?.isNotEmpty==true){
  54. if(md5Hex!= null){
  55. db.saveImage(this);
  56. }
  57. }
  58. }
  59. if(nonce.isNotEmpty && data!.isNotEmpty){
  60. debug('解密地图');
  61. data=await ffi.Crypto(bridge: ffi.api).decrypt(nonce: nonce, data: data!);
  62. info('解密成功');
  63. }
  64. return data!;
  65. }
  66. }