Commit b15fde72f848da4e48abb74731892ac5aef33e80

Authored by liangchengyou
1 parent 9efff6ae

feat:头像上传功能完善逻辑

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 &#39;user_avatar_event.dart&#39;; @@ -12,7 +13,7 @@ part &#39;user_avatar_event.dart&#39;;
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&lt;UserAvatarEvent, UserAvatarState&gt; { @@ -27,27 +28,18 @@ class UserAvatarBloc extends Bloc&lt;UserAvatarEvent, UserAvatarState&gt; {
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&lt;UserAvatarEvent, UserAvatarState&gt; { @@ -58,12 +50,11 @@ class UserAvatarBloc extends Bloc&lt;UserAvatarEvent, UserAvatarState&gt; {
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&lt;UserAvatarEvent, UserAvatarState&gt; { @@ -75,8 +66,8 @@ class UserAvatarBloc extends Bloc&lt;UserAvatarEvent, UserAvatarState&gt; {
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&lt;UserAvatarEvent, UserAvatarState&gt; { @@ -84,6 +75,11 @@ class UserAvatarBloc extends Bloc&lt;UserAvatarEvent, UserAvatarState&gt; {
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 }