|
|
|
import 'dart:async';
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
import 'package:doublefeel_flutter/app/modules/watch_theme/models/watch_theme_models.dart';
|
|
|
|
import 'package:doublefeel_flutter/app/routes/app_pages.dart';
|
|
...
|
...
|
@@ -7,15 +8,16 @@ import 'package:doublefeel_flutter/core/logging/app_logger.dart'; |
|
|
|
import 'package:doublefeel_flutter/core/network/api/theme_api.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/network/api/user_api.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/network/api/vip_api.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/result/app_result.dart';
|
|
|
|
import 'package:doublefeel_flutter/data/local/user_preferences_storage.dart';
|
|
|
|
import 'package:doublefeel_flutter/data/models/local/user_preferences.dart';
|
|
|
|
import 'package:doublefeel_flutter/data/models/user/user_models.dart';
|
|
|
|
import 'package:doublefeel_flutter/core/platform/pigeon_api_facade.dart';
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'package:flutter/services.dart';
|
|
|
|
import 'package:get/get.dart';
|
|
|
|
import 'package:image_cropper/image_cropper.dart';
|
|
|
|
import 'package:image_picker/image_picker.dart';
|
|
|
|
import 'package:logger/logger.dart';
|
|
|
|
|
|
|
|
class MyController extends GetxController {
|
|
|
|
MyController(this._userApi, this._vipApi, this._themeApi);
|
|
...
|
...
|
@@ -64,22 +66,45 @@ class MyController extends GetxController { |
|
|
|
);
|
|
|
|
if (picked == null) return; // 用户取消
|
|
|
|
AppLogger.e(picked.path);
|
|
|
|
// 2. 用 image_cropper 裁剪为正方形
|
|
|
|
final CroppedFile? cropped = await ImageCropper().cropImage(
|
|
|
|
sourcePath: picked.path,
|
|
|
|
aspectRatio: const CropAspectRatio(ratioX: 1, ratioY: 1),
|
|
|
|
uiSettings: [
|
|
|
|
AndroidUiSettings(
|
|
|
|
toolbarTitle: '裁剪头像',
|
|
|
|
lockAspectRatio: true,
|
|
|
|
),
|
|
|
|
IOSUiSettings(
|
|
|
|
title: '裁剪头像',
|
|
|
|
aspectRatioLockEnabled: true,
|
|
|
|
resetAspectRatioEnabled: false,
|
|
|
|
),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
// OHOS 版 image_cropper 使用 Flutter 页面承载裁剪 UI,必须显式传入
|
|
|
|
// BuildContext(该插件目前通过 WebUiSettings 读取该参数)。
|
|
|
|
final isOhos = Platform.operatingSystem.toLowerCase() == 'ohos';
|
|
|
|
final cropperContext = Get.context ?? Get.overlayContext;
|
|
|
|
CroppedFile? cropped;
|
|
|
|
try {
|
|
|
|
cropped = await ImageCropper().cropImage(
|
|
|
|
sourcePath: picked.path,
|
|
|
|
aspectRatio: const CropAspectRatio(ratioX: 1, ratioY: 1),
|
|
|
|
uiSettings: [
|
|
|
|
AndroidUiSettings(
|
|
|
|
toolbarTitle: '裁剪头像',
|
|
|
|
lockAspectRatio: true,
|
|
|
|
),
|
|
|
|
IOSUiSettings(
|
|
|
|
title: '裁剪头像',
|
|
|
|
aspectRatioLockEnabled: true,
|
|
|
|
resetAspectRatioEnabled: false,
|
|
|
|
),
|
|
|
|
if (isOhos && cropperContext != null)
|
|
|
|
WebUiSettings(context: cropperContext),
|
|
|
|
],
|
|
|
|
);
|
|
|
|
} finally {
|
|
|
|
if (isOhos) {
|
|
|
|
// 等待 cropper 路由的退场动画结束,防止其 AppBar 覆盖恢复的样式。
|
|
|
|
await Future<void>.delayed(const Duration(milliseconds: 400));
|
|
|
|
|
|
|
|
SystemChrome.setSystemUIOverlayStyle(
|
|
|
|
const SystemUiOverlayStyle(
|
|
|
|
statusBarColor: Colors.transparent,
|
|
|
|
statusBarIconBrightness: Brightness.dark,
|
|
|
|
statusBarBrightness: Brightness.light,
|
|
|
|
systemNavigationBarColor: Colors.transparent,
|
|
|
|
systemNavigationBarIconBrightness: Brightness.dark,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (cropped == null) return; // 用户取消裁剪
|
|
|
|
|
|
|
|
final ossPath = await _platformHostApi.uploadFile(
|
...
|
...
|
|