Commit b15fde72f848da4e48abb74731892ac5aef33e80
1 parent
9efff6ae
feat:头像上传功能完善逻辑
Showing
7 changed files
with
54 additions
and
31 deletions
lib/pages/user/bloc/user_bloc.dart
@@ -37,6 +37,15 @@ class UserBloc extends Bloc<UserEvent, UserState> { | @@ -37,6 +37,15 @@ class UserBloc extends Bloc<UserEvent, UserState> { | ||
37 | UserEntity user = UserUtil.getUser()!; | 37 | UserEntity user = UserUtil.getUser()!; |
38 | switch (event.type) { | 38 | switch (event.type) { |
39 | case ModifyUserInformationType.avatar: | 39 | case ModifyUserInformationType.avatar: |
40 | + String avatarUrl = event.content; | ||
41 | + try { | ||
42 | + await UserDao.updateUserInfoField(avatarUrl: avatarUrl); | ||
43 | + // 修改成功,更新本地缓存及UI | ||
44 | + user.avatarUrl = avatarUrl; | ||
45 | + emitter(UserInfoUpdated()); | ||
46 | + } catch (e) { | ||
47 | + Log.e('_updateUser avatarUrl, e: $e'); | ||
48 | + } | ||
40 | break; | 49 | break; |
41 | case ModifyUserInformationType.name: | 50 | case ModifyUserInformationType.name: |
42 | String name = event.content; | 51 | String name = event.content; |
lib/pages/user/information/user_information_page.dart
@@ -54,7 +54,7 @@ class _UserInformationContentView extends StatelessWidget { | @@ -54,7 +54,7 @@ class _UserInformationContentView extends StatelessWidget { | ||
54 | backgroundImage: ImageUtil.getImageProviderOnDefault(user.avatarUrl), | 54 | backgroundImage: ImageUtil.getImageProviderOnDefault(user.avatarUrl), |
55 | ), | 55 | ), |
56 | ), | 56 | ), |
57 | - onTap: () => pushNamed(AppRouteName.userAvatar) | 57 | + onTap: () => pushNamed(AppRouteName.userAvatar,arguments: {'pageType':'1'}) |
58 | ), | 58 | ), |
59 | 11.verticalSpace, | 59 | 11.verticalSpace, |
60 | _buildContentRow( | 60 | _buildContentRow( |
lib/pages/user/modify/modify_user_avatar_page.dart
@@ -8,8 +8,11 @@ import 'package:wow_english/common/widgets/ow_image_widget.dart'; | @@ -8,8 +8,11 @@ import 'package:wow_english/common/widgets/ow_image_widget.dart'; | ||
8 | import 'package:wow_english/common/widgets/we_app_bar.dart'; | 8 | import 'package:wow_english/common/widgets/we_app_bar.dart'; |
9 | import 'package:wow_english/pages/user/bloc/user_bloc.dart'; | 9 | import 'package:wow_english/pages/user/bloc/user_bloc.dart'; |
10 | import 'package:wow_english/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart'; | 10 | import 'package:wow_english/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart'; |
11 | +import 'package:wow_english/route/route.dart'; | ||
11 | import 'package:wow_english/utils/toast_util.dart'; | 12 | import 'package:wow_english/utils/toast_util.dart'; |
12 | 13 | ||
14 | +import 'modify_user_information_page.dart'; | ||
15 | + | ||
13 | class ModifyUserAvatarPage extends StatelessWidget { | 16 | class ModifyUserAvatarPage extends StatelessWidget { |
14 | const ModifyUserAvatarPage({super.key, required this.pageType}); | 17 | const ModifyUserAvatarPage({super.key, required this.pageType}); |
15 | 18 | ||
@@ -36,13 +39,18 @@ class _ModifyUserAvatarPage extends StatelessWidget { | @@ -36,13 +39,18 @@ class _ModifyUserAvatarPage extends StatelessWidget { | ||
36 | BlocListener<UserBloc,UserState>( | 39 | BlocListener<UserBloc,UserState>( |
37 | listener: (context, state){ | 40 | listener: (context, state){ |
38 | if (state is UserInfoUpdated) { | 41 | if (state is UserInfoUpdated) { |
39 | - showToast('修改成功'); | 42 | + if (pageType == 1) { |
43 | + showToast('修改成功'); | ||
44 | + popPage(); | ||
45 | + } else { | ||
46 | + context.read<UserAvatarBloc>().add(ChangeUserEnterAppStateEvent()); | ||
47 | + } | ||
40 | } | 48 | } |
41 | }), | 49 | }), |
42 | BlocListener<UserAvatarBloc,UserAvatarState>( | 50 | BlocListener<UserAvatarBloc,UserAvatarState>( |
43 | listener: (context,state){ | 51 | listener: (context,state){ |
44 | if (state is ChangeImageState) { | 52 | if (state is ChangeImageState) { |
45 | - showToast('上传图片'); | 53 | + context.read<UserBloc>().add(UserUpdate(ModifyUserInformationType.avatar,state.imageUrl)); |
46 | } | 54 | } |
47 | },) | 55 | },) |
48 | ], | 56 | ], |
lib/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart
1 | import 'package:flutter/cupertino.dart'; | 1 | import 'package:flutter/cupertino.dart'; |
2 | import 'package:flutter_bloc/flutter_bloc.dart'; | 2 | import 'package:flutter_bloc/flutter_bloc.dart'; |
3 | +import 'package:flutter_easyloading/flutter_easyloading.dart'; | ||
3 | import 'package:image_picker/image_picker.dart'; | 4 | import 'package:image_picker/image_picker.dart'; |
4 | import 'package:permission_handler/permission_handler.dart'; | 5 | import 'package:permission_handler/permission_handler.dart'; |
5 | import 'package:wow_english/common/core/assets_const.dart'; | 6 | import 'package:wow_english/common/core/assets_const.dart'; |
@@ -12,7 +13,7 @@ part 'user_avatar_event.dart'; | @@ -12,7 +13,7 @@ part 'user_avatar_event.dart'; | ||
12 | part 'user_avatar_state.dart'; | 13 | part 'user_avatar_state.dart'; |
13 | 14 | ||
14 | class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | 15 | class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { |
15 | - String _imageUrl = UserUtil.getUser()!.avatarUrl ?? AssetsConst.wowLogo; | 16 | + final String _imageUrl = UserUtil.getUser()!.avatarUrl ?? AssetsConst.wowLogo; |
16 | 17 | ||
17 | String get imageUrl => _imageUrl; | 18 | String get imageUrl => _imageUrl; |
18 | 19 | ||
@@ -27,27 +28,18 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | @@ -27,27 +28,18 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | ||
27 | final ImagePicker picker = ImagePicker(); | 28 | final ImagePicker picker = ImagePicker(); |
28 | 29 | ||
29 | UserAvatarBloc() : super(UserAvatarInitial()) { | 30 | UserAvatarBloc() : super(UserAvatarInitial()) { |
30 | - on<ChangeImageEvent>(_changeImage); | ||
31 | on<GetImageFromPhotoEvent>(_getImageFromPhoto); | 31 | on<GetImageFromPhotoEvent>(_getImageFromPhoto); |
32 | on<GetImageFromCameraEvent>(_getImageFromCamera); | 32 | on<GetImageFromCameraEvent>(_getImageFromCamera); |
33 | + on<ChangeUserEnterAppStateEvent>(_changeUserEnterAppState); | ||
33 | } | 34 | } |
34 | 35 | ||
35 | - Future<void> _uploadAvatar(String imagePath) async { | 36 | + Future<String> _uploadAvatar(String imagePath) async { |
36 | // todo 加个loading UI | 37 | // todo 加个loading UI |
37 | String avatarUrl = await AliyunOssUtil.uploadFile(imagePath); | 38 | String avatarUrl = await AliyunOssUtil.uploadFile(imagePath); |
39 | + debugPrint('>>>>>>>>>>阿里云图片地址$avatarUrl'); | ||
38 | // 上传服务器 | 40 | // 上传服务器 |
39 | - await UserDao.updateUserInfoField(avatarUrl: avatarUrl); | ||
40 | - _imageUrl = avatarUrl; | ||
41 | - } | ||
42 | - | ||
43 | - void _changeImage(ChangeImageEvent event, Emitter<UserAvatarState> emitter) async { | ||
44 | - //_imageUrl = event.imagePath; | ||
45 | - try { | ||
46 | - await _uploadAvatar(event.imagePath); | ||
47 | - emitter(ChangeImageState()); | ||
48 | - } catch (e) { | ||
49 | - Log.e('上传头像失败:$e'); | ||
50 | - } | 41 | + // await UserDao.updateUserInfoField(avatarUrl: avatarUrl); |
42 | + return avatarUrl; | ||
51 | } | 43 | } |
52 | 44 | ||
53 | void _getImageFromPhoto(GetImageFromPhotoEvent event, Emitter<UserAvatarState> emitter) async { | 45 | void _getImageFromPhoto(GetImageFromPhotoEvent event, Emitter<UserAvatarState> emitter) async { |
@@ -58,12 +50,11 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | @@ -58,12 +50,11 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | ||
58 | } | 50 | } |
59 | _file = await picker.pickImage(source: ImageSource.gallery); | 51 | _file = await picker.pickImage(source: ImageSource.gallery); |
60 | try { | 52 | try { |
61 | - await _uploadAvatar(_file!.path); | ||
62 | - emitter(ChangeImageState()); | 53 | + final urlStr = await _uploadAvatar(_file!.path); |
54 | + emitter(ChangeImageState(urlStr)); | ||
63 | } catch (e) { | 55 | } catch (e) { |
64 | Log.e('上传头像失败:$e'); | 56 | Log.e('上传头像失败:$e'); |
65 | } | 57 | } |
66 | - //emitter(ChangeImageState()); | ||
67 | }); | 58 | }); |
68 | } | 59 | } |
69 | 60 | ||
@@ -75,8 +66,8 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | @@ -75,8 +66,8 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | ||
75 | } | 66 | } |
76 | _file = await picker.pickImage(source: ImageSource.camera); | 67 | _file = await picker.pickImage(source: ImageSource.camera); |
77 | try { | 68 | try { |
78 | - await _uploadAvatar(_file!.path); | ||
79 | - emitter(ChangeImageState()); | 69 | + final urlStr = await _uploadAvatar(_file!.path); |
70 | + emitter(ChangeImageState(urlStr)); | ||
80 | } catch (e) { | 71 | } catch (e) { |
81 | Log.e('上传头像失败:$e'); | 72 | Log.e('上传头像失败:$e'); |
82 | } | 73 | } |
@@ -84,6 +75,11 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | @@ -84,6 +75,11 @@ class UserAvatarBloc extends Bloc<UserAvatarEvent, UserAvatarState> { | ||
84 | }); | 75 | }); |
85 | } | 76 | } |
86 | 77 | ||
78 | + void _changeUserEnterAppState(ChangeUserEnterAppStateEvent event,Emitter<UserAvatarState> emitter) async { | ||
79 | + _canInsertApp = true; | ||
80 | + emitter(ChangeUserEnterAppState()); | ||
81 | + } | ||
82 | + | ||
87 | ///获取相机权限 | 83 | ///获取相机权限 |
88 | Future<bool> getCameraPermissionStatus() async { | 84 | Future<bool> getCameraPermissionStatus() async { |
89 | Permission permission = Permission.camera; | 85 | Permission permission = Permission.camera; |
lib/pages/user/modify/user_avatar_bloc/user_avatar_event.dart
@@ -7,7 +7,5 @@ class GetImageFromPhotoEvent extends UserAvatarEvent {} | @@ -7,7 +7,5 @@ class GetImageFromPhotoEvent extends UserAvatarEvent {} | ||
7 | 7 | ||
8 | class GetImageFromCameraEvent extends UserAvatarEvent {} | 8 | class GetImageFromCameraEvent extends UserAvatarEvent {} |
9 | 9 | ||
10 | -class ChangeImageEvent extends UserAvatarEvent { | ||
11 | - final String imagePath; | ||
12 | - ChangeImageEvent(this.imagePath); | ||
13 | -} | 10 | +class ChangeUserEnterAppStateEvent extends UserAvatarEvent {} |
11 | + |
lib/pages/user/modify/user_avatar_bloc/user_avatar_state.dart
@@ -5,4 +5,9 @@ abstract class UserAvatarState {} | @@ -5,4 +5,9 @@ abstract class UserAvatarState {} | ||
5 | 5 | ||
6 | class UserAvatarInitial extends UserAvatarState {} | 6 | class UserAvatarInitial extends UserAvatarState {} |
7 | 7 | ||
8 | -class ChangeImageState extends UserAvatarState {} | 8 | +class ChangeImageState extends UserAvatarState { |
9 | + final String imageUrl; | ||
10 | + ChangeImageState(this.imageUrl); | ||
11 | +} | ||
12 | + | ||
13 | +class ChangeUserEnterAppState extends UserAvatarState{} | ||
9 | \ No newline at end of file | 14 | \ No newline at end of file |
lib/utils/aliyun_oss_util.dart
1 | import 'package:dio/dio.dart'; | 1 | import 'package:dio/dio.dart'; |
2 | +import 'package:flutter/cupertino.dart'; | ||
2 | import 'package:flutter_oss_aliyun/flutter_oss_aliyun.dart'; | 3 | import 'package:flutter_oss_aliyun/flutter_oss_aliyun.dart'; |
3 | import 'package:wow_english/common/request/request_client.dart'; | 4 | import 'package:wow_english/common/request/request_client.dart'; |
4 | import 'package:wow_english/models/aliyun_oss_upload_sts_entity.dart'; | 5 | import 'package:wow_english/models/aliyun_oss_upload_sts_entity.dart'; |
@@ -12,7 +13,12 @@ class AliyunOssUtil { | @@ -12,7 +13,12 @@ class AliyunOssUtil { | ||
12 | String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length); | 13 | String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length); |
13 | Log.d("待上传文件fileName: $fileName"); | 14 | Log.d("待上传文件fileName: $fileName"); |
14 | // 获取鉴权信息 | 15 | // 获取鉴权信息 |
15 | - AliyunOssUploadStsEntity stsEntity = await _getSts(fileName); | 16 | + AliyunOssUploadStsEntity? stsEntity = await _getSts(fileName); |
17 | + if(stsEntity == null) { | ||
18 | + // todo 为空的情况抛出错误 | ||
19 | + return ''; | ||
20 | + } | ||
21 | + debugPrint('鉴权信息$stsEntity'); | ||
16 | // 鉴权 | 22 | // 鉴权 |
17 | Client.init( | 23 | Client.init( |
18 | ossEndpoint: stsEntity.endpoint, | 24 | ossEndpoint: stsEntity.endpoint, |
@@ -43,8 +49,9 @@ class AliyunOssUtil { | @@ -43,8 +49,9 @@ class AliyunOssUtil { | ||
43 | } | 49 | } |
44 | 50 | ||
45 | /// 获取鉴权信息 | 51 | /// 获取鉴权信息 |
46 | - static Future<AliyunOssUploadStsEntity> _getSts(String fileName) async { | ||
47 | - var result = await requestClient.get(Apis.aliyunOssSts, queryParameters: {'fileName': fileName}); | 52 | + static Future<AliyunOssUploadStsEntity?> _getSts(String fileName) async { |
53 | + var result = await requestClient.get<AliyunOssUploadStsEntity>(Apis.aliyunOssSts, queryParameters: {'fileName': fileName}); | ||
54 | + debugPrint('鉴权结果$result'); | ||
48 | return result; | 55 | return result; |
49 | } | 56 | } |
50 | } | 57 | } |