verify_code_view_model.dart 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import 'dart:convert';
  2. import 'dart:io';
  3. import 'package:domain/repository/auth_repository.dart';
  4. import 'package:flutter_riverpod/flutter_riverpod.dart';
  5. import 'package:plugin_platform/engine/directory/directory_util.dart';
  6. import 'package:plugin_platform/engine/toast/toast_engine.dart';
  7. import 'package:plugin_platform/http/dio/dio_cancelable_mixin.dart';
  8. import 'package:shared/utils/log_utils.dart';
  9. import 'verify_code_state.dart';
  10. class VerifyCodeViewModel extends AutoDisposeNotifier<verifyCodeState> with DioCancelableMixin {
  11. late final AuthRepository authRepository;
  12. @override
  13. verifyCodeState build() {
  14. authRepository = ref.read(authRepositoryProvider);
  15. final state = verifyCodeState();
  16. registerCancellation(callback: () {
  17. _clearCachedImage();
  18. });
  19. return state;
  20. }
  21. ///获取验证码
  22. void fetchCode() async {
  23. final result = await authRepository.fetchCaptchaImage(cancelToken: cancelToken);
  24. // 获取 Base64 字符串并去掉前缀
  25. String base64String = result.data?.img ?? '';
  26. String fileExtension = ''; // 用于保存文件扩展名
  27. // 检查图像类型并去掉正确的前缀
  28. if (base64String.startsWith('data:image/jpeg;base64,')) {
  29. base64String = base64String.replaceFirst('data:image/jpeg;base64,', '');
  30. fileExtension = '.jpg'; // 设置文件扩展名为 .jpg
  31. } else if (base64String.startsWith('data:image/png;base64,')) {
  32. base64String = base64String.replaceFirst('data:image/png;base64,', '');
  33. fileExtension = '.png'; // 设置文件扩展名为 .png
  34. } else {
  35. // 如果图像格式不支持,可以显示错误信息
  36. ToastEngine.show("Unsupported image format");
  37. return;
  38. }
  39. try {
  40. // Base64 转为本地图片缓存
  41. final bytes = base64.decode(base64String);
  42. final tempDir = DirectoryUtil.getTempPath();
  43. final file = File('$tempDir/verify${DateTime.now().millisecondsSinceEpoch}$fileExtension'); // 使用正确的文件扩展名
  44. await file.writeAsBytes(bytes);
  45. Log.d('存入的File路径为:${file.path}');
  46. if (result.isSuccess) {
  47. state = state.copyWith(key: result.data?.key, imgFilePath: file.path);
  48. } else {
  49. ToastEngine.show(result.errorMsg ?? "Unknown Error");
  50. }
  51. } catch (e) {
  52. Log.e('Error decoding Base64 image: $e');
  53. ToastEngine.show("Error decoding image");
  54. }
  55. }
  56. // 清除缓存的verify验证图形码的缓存文件
  57. Future<void> _clearCachedImage() async {
  58. final cacheDir = await DirectoryUtil.initTempDir();
  59. if (cacheDir != null) {
  60. if (await cacheDir.exists()) {
  61. //遍历删除 Cache 目录下面的全部文件或文件夹
  62. for (final entity in cacheDir.listSync()) {
  63. // 如果是指定的文件直接删除
  64. if (entity is File && entity.path.split('/').last.startsWith("verify")) {
  65. await entity.delete();
  66. }
  67. }
  68. }
  69. }
  70. }
  71. }
  72. final verifyCodeProvider = NotifierProvider.autoDispose<VerifyCodeViewModel, verifyCodeState>(VerifyCodeViewModel.new);