From 8c8b5d7f51791d00a3b1cea3ff3ccbafa6e2db09 Mon Sep 17 00:00:00 2001 From: niuhuan Date: Fri, 25 Feb 2022 13:50:43 +0800 Subject: [PATCH] impl update avatar --- android/app/src/main/AndroidManifest.xml | 5 ++ go/go.mod | 2 +- go/go.sum | 2 + ios/Podfile.lock | 19 ++++++ lib/basic/Method.dart | 6 ++ lib/screens/components/UserProfileCard.dart | 59 ++++++++++++++++-- pubspec.lock | 66 +++++++++++++++++++-- pubspec.yaml | 2 + scripts/bind-ios-arm64.sh | 6 ++ scripts/bind-ios.sh | 6 ++ 10 files changed, 163 insertions(+), 10 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 5ffab36..a881bd4 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -53,5 +53,10 @@ + + diff --git a/go/go.mod b/go/go.mod index e84deb4..6cd5adb 100644 --- a/go/go.mod +++ b/go/go.mod @@ -9,7 +9,7 @@ require ( github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265 github.com/miguelpruivo/flutter_file_picker/go v0.0.0-20210622152105-9f0a811028a0 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/niuhuan/pica-go v0.0.0-20220223122613-0d7d95a9c728 + github.com/niuhuan/pica-go v0.0.0-20220224154849-76bf750f8c4d github.com/pkg/errors v0.9.1 golang.org/x/image v0.0.0-20190802002840-cff245a6509b golang.org/x/mobile v0.0.0-20220224134551-8a0a1e50732f // indirect diff --git a/go/go.sum b/go/go.sum index c5fcc38..241ad60 100644 --- a/go/go.sum +++ b/go/go.sum @@ -46,6 +46,8 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/niuhuan/pica-go v0.0.0-20220223122613-0d7d95a9c728 h1:zcO9WFgYbQ3g9U1nbJ6PCelzGB/BaPsCW9jwNry2JXM= github.com/niuhuan/pica-go v0.0.0-20220223122613-0d7d95a9c728/go.mod h1:r76zBgH9AYkv0ptyEVoPUIdt33sT0Ts7xgcg742OZtw= +github.com/niuhuan/pica-go v0.0.0-20220224154849-76bf750f8c4d h1:f3V6V1Y+5j/AvhsIGA6aQ/K2Ez1AeYbuCG9uI4fGC6M= +github.com/niuhuan/pica-go v0.0.0-20220224154849-76bf750f8c4d/go.mod h1:r76zBgH9AYkv0ptyEVoPUIdt33sT0Ts7xgcg742OZtw= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 153c752..1b0ed4c 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -1,18 +1,34 @@ PODS: - Flutter (1.0.0) + - image_cropper (0.0.4): + - Flutter + - TOCropViewController (~> 2.6.1) + - image_picker (0.0.1): + - Flutter - "permission_handler (5.1.0+2)": - Flutter + - TOCropViewController (2.6.1) - url_launcher_ios (0.0.1): - Flutter DEPENDENCIES: - Flutter (from `Flutter`) + - image_cropper (from `.symlinks/plugins/image_cropper/ios`) + - image_picker (from `.symlinks/plugins/image_picker/ios`) - permission_handler (from `.symlinks/plugins/permission_handler/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) +SPEC REPOS: + trunk: + - TOCropViewController + EXTERNAL SOURCES: Flutter: :path: Flutter + image_cropper: + :path: ".symlinks/plugins/image_cropper/ios" + image_picker: + :path: ".symlinks/plugins/image_picker/ios" permission_handler: :path: ".symlinks/plugins/permission_handler/ios" url_launcher_ios: @@ -20,7 +36,10 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98 + image_picker: 541dcbb3b9cf32d87eacbd957845d8651d6c62c3 permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 + TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 url_launcher_ios: 839c58cdb4279282219f5e248c3321761ff3c4de PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c diff --git a/lib/basic/Method.dart b/lib/basic/Method.dart index b0b3237..461e2ce 100644 --- a/lib/basic/Method.dart +++ b/lib/basic/Method.dart @@ -692,4 +692,10 @@ class Method { Future updateSlogan(String input) async { return await _flatInvoke("updateSlogan", input); } + + /// 更新签名 + Future updateAvatar(String data) async { + return await _flatInvoke("updateAvatar", data); + } + } diff --git a/lib/screens/components/UserProfileCard.dart b/lib/screens/components/UserProfileCard.dart index 0ebba19..182f29f 100644 --- a/lib/screens/components/UserProfileCard.dart +++ b/lib/screens/components/UserProfileCard.dart @@ -1,6 +1,10 @@ +import 'dart:convert'; +import 'dart:io'; import 'dart:ui'; import 'package:flutter/material.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; import 'package:pikapika/basic/Common.dart'; import 'package:pikapika/basic/Entities.dart'; import 'package:pikapika/basic/Method.dart'; @@ -112,7 +116,14 @@ class _UserProfileCardState extends State { child: Column( children: [ Expanded(child: Container()), - Avatar(profile.avatar, size: 65), + GestureDetector( + onTap: () async { + if (Platform.isAndroid || Platform.isIOS) { + await _updateAvatarPhone(); + } + }, + child: Avatar(profile.avatar, size: 65), + ), Container(height: 5), Text( profile.name, @@ -134,9 +145,7 @@ class _UserProfileCardState extends State { ); if (input != null) { await method.updateSlogan(input); - setState(() { - _future = _load(); - }); + _reload(); } }, child: Text( @@ -156,4 +165,46 @@ class _UserProfileCardState extends State { }, ); } + + Future _updateAvatarPhone() async { + final ImagePicker _picker = ImagePicker(); + final XFile? image = await _picker.pickImage(source: ImageSource.gallery); + if (image != null) { + final theme = Theme.of(context); + final cropper = ImageCropper(); + File? croppedFile = await cropper.cropImage( + sourcePath: image.path, + aspectRatioPresets: [ + CropAspectRatioPreset.square, + ], + aspectRatio: CropAspectRatio(ratioX: 200, ratioY: 200), + maxWidth: 200, + maxHeight: 200, + androidUiSettings: AndroidUiSettings( + toolbarTitle: "修改头像", + toolbarColor: theme.appBarTheme.backgroundColor, + toolbarWidgetColor: Colors.white, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: true, + ), + iosUiSettings: IOSUiSettings( + resetAspectRatioEnabled: true, + aspectRatioLockEnabled: true, + title: "修改头像", + ), + ); + if (croppedFile != null) { + var buff = await croppedFile.readAsBytes(); + var data = base64Encode(buff); + await method.updateAvatar(data); + _reload(); + } + } + } + + void _reload() { + setState(() { + _future = _load(); + }); + } } diff --git a/pubspec.lock b/pubspec.lock index cd38391..6b71527 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,7 +7,7 @@ packages: name: another_xlider url: "https://pub.dartlang.org" source: hosted - version: "1.0.0" + version: "1.0.1+2" async: dependency: transitive description: @@ -57,6 +57,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.15.0" + cross_file: + dependency: transitive + description: + name: cross_file + url: "https://pub.dartlang.org" + source: hosted + version: "0.3.2" cupertino_icons: dependency: "direct main" description: @@ -102,6 +109,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.5" flutter_search_bar: dependency: "direct main" description: @@ -133,6 +147,48 @@ packages: description: flutter source: sdk version: "0.0.0" + http: + dependency: transitive + description: + name: http + url: "https://pub.dartlang.org" + source: hosted + version: "0.13.4" + http_parser: + dependency: transitive + description: + name: http_parser + url: "https://pub.dartlang.org" + source: hosted + version: "4.0.0" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + url: "https://pub.dartlang.org" + source: hosted + version: "0.8.4+9" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.6" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.4" intl: dependency: transitive description: @@ -319,7 +375,7 @@ packages: name: url_launcher url: "https://pub.dartlang.org" source: hosted - version: "6.0.18" + version: "6.0.20" url_launcher_android: dependency: transitive description: @@ -340,14 +396,14 @@ packages: name: url_launcher_linux url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.0" url_launcher_macos: dependency: transitive description: name: url_launcher_macos url: "https://pub.dartlang.org" source: hosted - version: "2.0.3" + version: "3.0.0" url_launcher_platform_interface: dependency: transitive description: @@ -368,7 +424,7 @@ packages: name: url_launcher_windows url: "https://pub.dartlang.org" source: hosted - version: "2.0.2" + version: "3.0.0" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 08ac1b8..d499d96 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -43,6 +43,8 @@ dependencies: multi_select_flutter: ^4.0.0 flutter_datetime_picker: ^1.5.1 modal_bottom_sheet: ^2.0.0 + image_cropper: ^1.5.0 + image_picker: ^0.8.4+9 dev_dependencies: flutter_test: diff --git a/scripts/bind-ios-arm64.sh b/scripts/bind-ios-arm64.sh index d6c1c5c..7f812ac 100644 --- a/scripts/bind-ios-arm64.sh +++ b/scripts/bind-ios-arm64.sh @@ -1 +1,7 @@ +# 编译所有架构的依赖 + +cd "$( cd "$( dirname "$0" )" && pwd )/.." + +cd go/mobile + gomobile bind -target=ios -o lib/Mobile.xcframework ./ diff --git a/scripts/bind-ios.sh b/scripts/bind-ios.sh index d6c1c5c..7f812ac 100644 --- a/scripts/bind-ios.sh +++ b/scripts/bind-ios.sh @@ -1 +1,7 @@ +# 编译所有架构的依赖 + +cd "$( cd "$( dirname "$0" )" && pwd )/.." + +cd go/mobile + gomobile bind -target=ios -o lib/Mobile.xcframework ./