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 37 UserEntity user = UserUtil.getUser()!;
38 38 switch (event.type) {
39 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 49 break;
41 50 case ModifyUserInformationType.name:
42 51 String name = event.content;
... ...
lib/pages/user/information/user_information_page.dart
... ... @@ -54,7 +54,7 @@ class _UserInformationContentView extends StatelessWidget {
54 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 59 11.verticalSpace,
60 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 import 'package:wow_english/common/widgets/we_app_bar.dart';
9 9 import 'package:wow_english/pages/user/bloc/user_bloc.dart';
10 10 import 'package:wow_english/pages/user/modify/user_avatar_bloc/user_avatar_bloc.dart';
  11 +import 'package:wow_english/route/route.dart';
11 12 import 'package:wow_english/utils/toast_util.dart';
12 13  
  14 +import 'modify_user_information_page.dart';
  15 +
13 16 class ModifyUserAvatarPage extends StatelessWidget {
14 17 const ModifyUserAvatarPage({super.key, required this.pageType});
15 18  
... ... @@ -36,13 +39,18 @@ class _ModifyUserAvatarPage extends StatelessWidget {
36 39 BlocListener<UserBloc,UserState>(
37 40 listener: (context, state){
38 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 50 BlocListener<UserAvatarBloc,UserAvatarState>(
43 51 listener: (context,state){
44 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 1 import 'package:flutter/cupertino.dart';
2 2 import 'package:flutter_bloc/flutter_bloc.dart';
  3 +import 'package:flutter_easyloading/flutter_easyloading.dart';
3 4 import 'package:image_picker/image_picker.dart';
4 5 import 'package:permission_handler/permission_handler.dart';
5 6 import 'package:wow_english/common/core/assets_const.dart';
... ... @@ -12,7 +13,7 @@ part &#39;user_avatar_event.dart&#39;;
12 13 part 'user_avatar_state.dart';
13 14  
14 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 18 String get imageUrl => _imageUrl;
18 19  
... ... @@ -27,27 +28,18 @@ class UserAvatarBloc extends Bloc&lt;UserAvatarEvent, UserAvatarState&gt; {
27 28 final ImagePicker picker = ImagePicker();
28 29  
29 30 UserAvatarBloc() : super(UserAvatarInitial()) {
30   - on<ChangeImageEvent>(_changeImage);
31 31 on<GetImageFromPhotoEvent>(_getImageFromPhoto);
32 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 37 // todo 加个loading UI
37 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 45 void _getImageFromPhoto(GetImageFromPhotoEvent event, Emitter<UserAvatarState> emitter) async {
... ... @@ -58,12 +50,11 @@ class UserAvatarBloc extends Bloc&lt;UserAvatarEvent, UserAvatarState&gt; {
58 50 }
59 51 _file = await picker.pickImage(source: ImageSource.gallery);
60 52 try {
61   - await _uploadAvatar(_file!.path);
62   - emitter(ChangeImageState());
  53 + final urlStr = await _uploadAvatar(_file!.path);
  54 + emitter(ChangeImageState(urlStr));
63 55 } catch (e) {
64 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 66 }
76 67 _file = await picker.pickImage(source: ImageSource.camera);
77 68 try {
78   - await _uploadAvatar(_file!.path);
79   - emitter(ChangeImageState());
  69 + final urlStr = await _uploadAvatar(_file!.path);
  70 + emitter(ChangeImageState(urlStr));
80 71 } catch (e) {
81 72 Log.e('上传头像失败:$e');
82 73 }
... ... @@ -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 84 Future<bool> getCameraPermissionStatus() async {
89 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  
8 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 5  
6 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 14 \ No newline at end of file
... ...
lib/utils/aliyun_oss_util.dart
1 1 import 'package:dio/dio.dart';
  2 +import 'package:flutter/cupertino.dart';
2 3 import 'package:flutter_oss_aliyun/flutter_oss_aliyun.dart';
3 4 import 'package:wow_english/common/request/request_client.dart';
4 5 import 'package:wow_english/models/aliyun_oss_upload_sts_entity.dart';
... ... @@ -12,7 +13,12 @@ class AliyunOssUtil {
12 13 String fileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length);
13 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 23 Client.init(
18 24 ossEndpoint: stsEntity.endpoint,
... ... @@ -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 55 return result;
49 56 }
50 57 }
... ...