Commit 795fb23f64f4c9e74ce05fd5c0b876b044768e39

Authored by 吴启风
1 parent e0766888

feat:支付成功刷新用户数据

lib/models/user_entity.dart
@@ -63,6 +63,11 @@ class UserEntity { @@ -63,6 +63,11 @@ class UserEntity {
63 : '女'; 63 : '女';
64 } 64 }
65 65
  66 + // 是否有游戏权限
  67 + bool hasGamePermission() {
  68 + return valid ?? false;
  69 + }
  70 +
66 UserEntity copyWith({ 71 UserEntity copyWith({
67 int? id, 72 int? id,
68 String? name, 73 String? name,
lib/pages/moduleSelect/view.dart
@@ -4,6 +4,7 @@ import 'package:wow_english/common/core/app_config_helper.dart'; @@ -4,6 +4,7 @@ import 'package:wow_english/common/core/app_config_helper.dart';
4 import 'package:wow_english/common/extension/string_extension.dart'; 4 import 'package:wow_english/common/extension/string_extension.dart';
5 import 'package:wow_english/pages/moduleSelect/state.dart'; 5 import 'package:wow_english/pages/moduleSelect/state.dart';
6 import 'package:wow_english/pages/moduleSelect/widgets/BaseHomeHeaderWidget.dart'; 6 import 'package:wow_english/pages/moduleSelect/widgets/BaseHomeHeaderWidget.dart';
  7 +import 'package:wow_english/pages/user/bloc/user_bloc.dart';
7 8
8 import '../../common/core/user_util.dart'; 9 import '../../common/core/user_util.dart';
9 import '../../common/dialogs/show_dialog.dart'; 10 import '../../common/dialogs/show_dialog.dart';
@@ -27,16 +28,18 @@ class ModuleSelectPage extends StatelessWidget { @@ -27,16 +28,18 @@ class ModuleSelectPage extends StatelessWidget {
27 class _HomePageView extends StatelessWidget { 28 class _HomePageView extends StatelessWidget {
28 @override 29 @override
29 Widget build(BuildContext context) { 30 Widget build(BuildContext context) {
30 - final bloc = BlocProvider.of<ModuleSelectBloc>(context);  
31 - return BlocListener<ModuleSelectBloc, ModuleSelectState>(  
32 - listener: (context, state) {},  
33 - child: _homeView(),  
34 - ); 31 + return MultiBlocListener(listeners: [
  32 + BlocListener<UserBloc, UserState>(listener: (context, state) {
  33 + debugPrint('WQF ModuleSelectPage BlocListener state: $state');
  34 + }),
  35 + BlocListener<ModuleSelectBloc, ModuleSelectState>(
  36 + listener: (context, state) {},
  37 + ),
  38 + ], child: _homeView());
35 } 39 }
36 40
37 Widget _homeView() => BlocBuilder<ModuleSelectBloc, ModuleSelectState>( 41 Widget _homeView() => BlocBuilder<ModuleSelectBloc, ModuleSelectState>(
38 builder: (context, state) { 42 builder: (context, state) {
39 - final bloc = BlocProvider.of<ModuleSelectBloc>(context);  
40 return Scaffold( 43 return Scaffold(
41 body: Container( 44 body: Container(
42 color: Colors.white, 45 color: Colors.white,
@@ -79,46 +82,55 @@ class _HomePageView extends StatelessWidget { @@ -79,46 +82,55 @@ class _HomePageView extends StatelessWidget {
79 ), 82 ),
80 ), 83 ),
81 Expanded( 84 Expanded(
82 - child: GestureDetector(  
83 - onTap: () {  
84 - //如果没登录先登录  
85 - if (UserUtil.isLogined()) {  
86 - if (AppConfigHelper.shouldHidePay()) {  
87 - pushNamed(AppRouteName.games);  
88 - } else {  
89 - if (UserUtil.hasGamePermission()) { 85 + child: BlocBuilder<UserBloc, UserState>(
  86 + builder: (context, userState) {
  87 + final userBloc = BlocProvider.of<UserBloc>(context);
  88 + debugPrint(
  89 + 'WQF ModuleSelectPage BlocBuilder state: $userState');
  90 + return GestureDetector(
  91 + onTap: () {
  92 + //如果没登录先登录
  93 + if (UserUtil.isLogined()) {
  94 + if (AppConfigHelper.shouldHidePay()) {
90 pushNamed(AppRouteName.games); 95 pushNamed(AppRouteName.games);
91 } else { 96 } else {
92 - showTwoActionDialog(  
93 - '提示', '忽略', '去续费',  
94 - '您的课程已到期,请快快续费继续学习吧!', leftTap: () {  
95 - popPage();  
96 - }, rightTap: () {  
97 - popPage();  
98 - pushNamed(AppRouteName.shop);  
99 - }); 97 + if (UserUtil.hasGamePermission()) {
  98 + pushNamed(AppRouteName.games);
  99 + } else {
  100 + showTwoActionDialog('提示', '忽略', '去续费',
  101 + '您的课程已到期,请快快续费继续学习吧!', leftTap: () {
  102 + popPage();
  103 + }, rightTap: () {
  104 + popPage();
  105 + pushNamed(AppRouteName.shop);
  106 + });
  107 + }
100 } 108 }
  109 + } else {
  110 + pushNamed(AppRouteName.login);
101 } 111 }
102 - } else {  
103 - pushNamed(AppRouteName.login);  
104 - }  
105 - },  
106 - child: Column(  
107 - mainAxisAlignment: MainAxisAlignment.center,  
108 - children: [  
109 - Stack(  
110 - alignment: AlignmentDirectional.center,  
111 - children: [  
112 - Image.asset('bg_frame_module'.assetPng,  
113 - width: 162.5.w, height: 203.5.h),  
114 - Image.asset('pic_module_game'.assetPng,  
115 - width: 140.5.w, height: 172.h)  
116 - ]),  
117 - 10.verticalSpace,  
118 - Image.asset('label_module_game'.assetPng,  
119 - width: 124.w, height: 34.h),  
120 - ],  
121 - )), 112 + },
  113 + child: Column(
  114 + mainAxisAlignment: MainAxisAlignment.center,
  115 + children: [
  116 + Stack(
  117 + alignment: AlignmentDirectional.center,
  118 + children: [
  119 + Image.asset(
  120 + 'bg_frame_module'.assetPng,
  121 + width: 162.5.w,
  122 + height: 203.5.h),
  123 + Image.asset(
  124 + 'pic_module_game'.assetPng,
  125 + width: 140.5.w,
  126 + height: 172.h)
  127 + ]),
  128 + 10.verticalSpace,
  129 + Image.asset('label_module_game'.assetPng,
  130 + width: 124.w, height: 34.h),
  131 + ],
  132 + ));
  133 + }),
122 ), 134 ),
123 ], 135 ],
124 ), 136 ),
lib/pages/shopping/view.dart
1 -import 'package:cached_network_image/cached_network_image.dart';  
2 import 'package:flutter/material.dart'; 1 import 'package:flutter/material.dart';
3 import 'package:flutter_bloc/flutter_bloc.dart'; 2 import 'package:flutter_bloc/flutter_bloc.dart';
4 import 'package:flutter_screenutil/flutter_screenutil.dart'; 3 import 'package:flutter_screenutil/flutter_screenutil.dart';
@@ -8,6 +7,7 @@ import &#39;package:wow_english/models/product_entity.dart&#39;; @@ -8,6 +7,7 @@ import &#39;package:wow_english/models/product_entity.dart&#39;;
8 import '../../common/core/assets_const.dart'; 7 import '../../common/core/assets_const.dart';
9 import '../../common/widgets/we_app_bar.dart'; 8 import '../../common/widgets/we_app_bar.dart';
10 import '../../utils/image_util.dart'; 9 import '../../utils/image_util.dart';
  10 +import '../user/bloc/user_bloc.dart';
11 import 'bloc.dart'; 11 import 'bloc.dart';
12 import 'event.dart'; 12 import 'event.dart';
13 import 'state.dart'; 13 import 'state.dart';
@@ -65,9 +65,11 @@ class _ShoppingView extends StatelessWidget { @@ -65,9 +65,11 @@ class _ShoppingView extends StatelessWidget {
65 @override 65 @override
66 Widget build(BuildContext context) { 66 Widget build(BuildContext context) {
67 final bloc = BlocProvider.of<ShoppingBloc>(context); 67 final bloc = BlocProvider.of<ShoppingBloc>(context);
  68 + final userBloc = BlocProvider.of<UserBloc>(context);
68 return BlocListener<ShoppingBloc, ShoppingState>( 69 return BlocListener<ShoppingBloc, ShoppingState>(
69 listener: (context, state) { 70 listener: (context, state) {
70 if (state is PaySuccessState) { 71 if (state is PaySuccessState) {
  72 + userBloc.add(PayStateChangeEvent());
71 Navigator.pop(context); 73 Navigator.pop(context);
72 } 74 }
73 }, 75 },
lib/pages/user/bloc/user_bloc.dart
@@ -12,12 +12,16 @@ part &#39;user_state.dart&#39;; @@ -12,12 +12,16 @@ part &#39;user_state.dart&#39;;
12 class UserBloc extends Bloc<UserEvent, UserState> { 12 class UserBloc extends Bloc<UserEvent, UserState> {
13 final TextEditingController modifyTextController = TextEditingController(); 13 final TextEditingController modifyTextController = TextEditingController();
14 int tempGender = 0; 14 int tempGender = 0;
  15 + UserEntity? _userEntityForPay;
  16 +
  17 + UserEntity? get userEntityForPay => _userEntityForPay;
15 18
16 UserBloc() : super(UserInitial()) { 19 UserBloc() : super(UserInitial()) {
17 on<UserLogout>(_logout); 20 on<UserLogout>(_logout);
18 on<UserDelete>(_deleteAccount); 21 on<UserDelete>(_deleteAccount);
19 on<UserUpdate>(_updateUser); 22 on<UserUpdate>(_updateUser);
20 on<UserUIUpdate>(_updateUIUser); 23 on<UserUIUpdate>(_updateUIUser);
  24 + on<PayStateChangeEvent>(_patStateChanged);
21 } 25 }
22 26
23 void _logout(UserLogout event, Emitter<UserState> emitter) async { 27 void _logout(UserLogout event, Emitter<UserState> emitter) async {
@@ -78,4 +82,17 @@ class UserBloc extends Bloc&lt;UserEvent, UserState&gt; { @@ -78,4 +82,17 @@ class UserBloc extends Bloc&lt;UserEvent, UserState&gt; {
78 Log.e('修改个人信息失败: $e'); 82 Log.e('修改个人信息失败: $e');
79 } 83 }
80 } 84 }
  85 +
  86 + //支付状态变化
  87 + void _patStateChanged(PayStateChangeEvent event, Emitter<UserState> emitter) async {
  88 + // 由于userInfo接口不会返回token,所以这里需要再次保存一下token
  89 + final token = UserUtil.getUser()?.token;
  90 + _userEntityForPay = await UserDao.getUserInfo();
  91 + if (_userEntityForPay == null) {
  92 + return;
  93 + }
  94 + _userEntityForPay?.token = token;
  95 + UserUtil.saveUser(_userEntityForPay);
  96 + emitter(UserPayStateChangedState());
  97 + }
81 } 98 }
lib/pages/user/bloc/user_event.dart
@@ -22,3 +22,5 @@ class UserUIUpdate extends UserEvent { @@ -22,3 +22,5 @@ class UserUIUpdate extends UserEvent {
22 22
23 UserUIUpdate(this.type); 23 UserUIUpdate(this.type);
24 } 24 }
  25 +
  26 +class PayStateChangeEvent extends UserEvent {}
25 \ No newline at end of file 27 \ No newline at end of file
lib/pages/user/bloc/user_state.dart
@@ -5,3 +5,5 @@ sealed class UserState {} @@ -5,3 +5,5 @@ sealed class UserState {}
5 class UserInitial extends UserState {} 5 class UserInitial extends UserState {}
6 6
7 class UserInfoUpdated extends UserState {} 7 class UserInfoUpdated extends UserState {}
  8 +
  9 +class UserPayStateChangedState extends UserState {}