Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
ethan
/
appframe
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Commit 363514eb
authored
2025-12-21 18:36:47 +0800
by
tanghuan
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
增加提示信息,增加对用户角色数据的处理
1 parent
2e3fcdbe
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
252 additions
and
107 deletions
lib/bloc/login_main_cubit.dart
lib/bloc/login_phone_cubit.dart
lib/bloc/login_qr_cubit.dart
lib/data/repositories/phone_auth_repository.dart
lib/data/repositories/wechat_auth_repository.dart
lib/ui/pages/login_main_page.dart
lib/ui/pages/login_phone_page.dart
lib/ui/pages/login_qr_page.dart
lib/ui/widgets/tip_overlay_widget.dart
lib/bloc/login_main_cubit.dart
View file @
363514e
...
...
@@ -10,24 +10,23 @@ class LoginMainState extends Equatable {
final
bool
agreed
;
final
bool
showAgreed
;
final
bool
loading
;
final
bool
showSnackBar
;
final
String
snackBarMsg
;
const
LoginMainState
({
this
.
agreed
=
false
,
this
.
showAgreed
=
false
,
this
.
loading
=
false
,
this
.
showSnackBar
=
false
,
this
.
snackBarMsg
=
''
,
});
@override
List
<
Object
?>
get
props
=>
[
agreed
,
showAgreed
,
loading
,
];
LoginMainState
copyWith
({
bool
?
agreed
,
bool
?
showAgreed
,
bool
?
loading
,
bool
?
showSnackBar
,
String
?
snackBarMsg
,
})
{
return
LoginMainState
(
agreed:
agreed
??
this
.
agreed
,
...
...
@@ -35,6 +34,15 @@ class LoginMainState extends Equatable {
loading:
loading
??
this
.
loading
,
);
}
@override
List
<
Object
?>
get
props
=>
[
agreed
,
showAgreed
,
loading
,
showSnackBar
,
snackBarMsg
,
];
}
class
LoginMainCubit
extends
Cubit
<
LoginMainState
>
{
...
...
@@ -67,12 +75,14 @@ class LoginMainCubit extends Cubit<LoginMainState> {
return
;
}
var
r
esult
=
await
_fluwx
.
authBy
(
var
authR
esult
=
await
_fluwx
.
authBy
(
which:
NormalAuth
(
scope:
'snsapi_userinfo'
,
state:
'wechat_sdk_test'
),
);
if
(!
result
)
{
throw
Exception
(
'微信授权处理失败'
);
if
(!
authResult
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
'微信授权处理失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
// 控制显示加载框
...
...
@@ -94,20 +104,39 @@ class LoginMainCubit extends Cubit<LoginMainState> {
return
;
}
dynamic
resultData
=
await
_wechatAuthRepository
.
codeToSk
(
response
.
code
!);
// 后续添加错误处理
if
(
resultData
[
'resultCode'
]
!=
'001'
)
{
var
resultData
=
await
_wechatAuthRepository
.
codeToSk
(
response
.
code
!)
as
Map
<
String
,
dynamic
>?;
// 请求接口异常
if
(
resultData
==
null
)
{
emit
(
state
.
copyWith
(
loading:
false
,
showSnackBar:
true
,
snackBarMsg:
'登录请求处理失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
var
data
=
resultData
[
'data'
];
var
role
=
data
[
'roles'
][
0
];
// 状态码错误
if
(
resultData
[
'resultCode'
]
!=
'001'
)
{
emit
(
state
.
copyWith
(
loading:
false
,
showSnackBar:
true
,
snackBarMsg:
'登录请求状态失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
final
sessionCode
=
data
[
'sessionCode'
];
final
userCode
=
data
[
'userCode'
];
var
classCode
=
role
[
'classCode'
];
var
userType
=
role
[
'userType'
];
var
stuId
=
role
[
'stuId'
];
var
data
=
resultData
[
'data'
]
as
Map
<
String
,
dynamic
>;
var
roles
=
data
[
'roles'
];
// 过滤出家长角色的数据
roles
.
removeWhere
((
element
)
=>
element
[
'userType'
]
!=
2
);
var
sessionCode
=
data
[
'sessionCode'
];
var
userCode
=
data
[
'userCode'
];
var
classCode
=
''
;
var
userType
=
0
;
var
stuId
=
''
;
if
(
roles
.
isNotEmpty
)
{
var
role
=
roles
[
0
];
classCode
=
role
[
'classCode'
];
userType
=
role
[
'userType'
];
stuId
=
role
[
'stuId'
];
}
var
sharedPreferences
=
getIt
.
get
<
SharedPreferences
>();
var
preUserCode
=
sharedPreferences
.
getString
(
'pre_userCode'
)
??
''
;
...
...
@@ -116,19 +145,34 @@ class LoginMainCubit extends Cubit<LoginMainState> {
sharedPreferences
.
setString
(
'pre_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'pre_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'pre_userType'
,
userType
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
??
''
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
);
}
else
{
// 前一个登录用户重新登录
classCode
=
sharedPreferences
.
getString
(
'pre_classCode'
);
userType
=
sharedPreferences
.
getInt
(
'pre_userType'
);
stuId
=
sharedPreferences
.
getString
(
'pre_stuId'
);
var
preClassCode
=
sharedPreferences
.
getString
(
'pre_classCode'
)
??
''
;
var
preUserType
=
sharedPreferences
.
getInt
(
'pre_userType'
)
??
0
;
var
preStuId
=
sharedPreferences
.
getString
(
'pre_stuId'
)
??
''
;
if
(
preClassCode
!=
''
&&
roles
.
any
((
element
)
=>
element
[
'classCode'
]
==
preClassCode
&&
element
[
'userType'
]
==
preUserType
&&
element
[
'stuId'
]
==
preStuId
))
{
classCode
=
preClassCode
;
userType
=
preUserType
;
stuId
=
preStuId
;
}
else
{
sharedPreferences
.
setString
(
'pre_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'pre_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'pre_userType'
,
userType
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
);
}
}
sharedPreferences
.
setString
(
'auth_sessionCode'
,
sessionCode
);
sharedPreferences
.
setString
(
'auth_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'auth_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'auth_userType'
,
userType
);
sharedPreferences
.
setString
(
'auth_stuId'
,
stuId
??
''
);
sharedPreferences
.
setString
(
'auth_stuId'
,
stuId
);
router
.
go
(
'/web'
,
...
...
lib/bloc/login_phone_cubit.dart
View file @
363514e
...
...
@@ -140,21 +140,35 @@ class LoginPhoneCubit extends Cubit<LoginPhoneState> {
return
;
}
var
result
=
await
_phoneAuthRepository
.
login
(
phone
,
verifyCode
);
if
(
result
[
'code'
]
!=
0
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
result
[
'error'
]));
var
resultData
=
await
_phoneAuthRepository
.
login
(
phone
,
verifyCode
);
if
(
resultData
==
null
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
'登录请求失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
if
(
resultData
[
'code'
]
!=
0
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
resultData
[
'error'
]));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
var
data
=
result
[
'data'
];
var
role
=
data
[
'roles'
][
0
];
final
sessionCode
=
data
[
'sessionCode'
];
final
userCode
=
data
[
'userCode'
];
var
classCode
=
role
[
'classCode'
];
var
userType
=
role
[
'userType'
];
var
stuId
=
role
[
'stuId'
];
var
data
=
resultData
[
'data'
]
as
Map
<
String
,
dynamic
>;
var
roles
=
data
[
'roles'
];
// 过滤出家长角色的数据
roles
.
removeWhere
((
element
)
=>
element
[
'userType'
]
!=
2
);
var
sessionCode
=
data
[
'sessionCode'
];
var
userCode
=
data
[
'userCode'
];
var
classCode
=
''
;
var
userType
=
0
;
var
stuId
=
''
;
if
(
roles
.
isNotEmpty
)
{
var
role
=
roles
[
0
];
classCode
=
role
[
'classCode'
];
userType
=
role
[
'userType'
];
stuId
=
role
[
'stuId'
];
}
var
sharedPreferences
=
getIt
.
get
<
SharedPreferences
>();
var
preUserCode
=
sharedPreferences
.
getString
(
'pre_userCode'
)
??
''
;
...
...
@@ -163,19 +177,34 @@ class LoginPhoneCubit extends Cubit<LoginPhoneState> {
sharedPreferences
.
setString
(
'pre_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'pre_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'pre_userType'
,
userType
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
??
''
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
);
}
else
{
// 前一个登录用户重新登录
classCode
=
sharedPreferences
.
getString
(
'pre_classCode'
);
userType
=
sharedPreferences
.
getInt
(
'pre_userType'
);
stuId
=
sharedPreferences
.
getString
(
'pre_stuId'
);
var
preClassCode
=
sharedPreferences
.
getString
(
'pre_classCode'
)
??
''
;
var
preUserType
=
sharedPreferences
.
getInt
(
'pre_userType'
)
??
0
;
var
preStuId
=
sharedPreferences
.
getString
(
'pre_stuId'
)
??
''
;
if
(
preClassCode
!=
''
&&
roles
.
any
((
element
)
=>
element
[
'classCode'
]
==
preClassCode
&&
element
[
'userType'
]
==
preUserType
&&
element
[
'stuId'
]
==
preStuId
))
{
classCode
=
preClassCode
;
userType
=
preUserType
;
stuId
=
preStuId
;
}
else
{
sharedPreferences
.
setString
(
'pre_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'pre_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'pre_userType'
,
userType
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
);
}
}
sharedPreferences
.
setString
(
'auth_sessionCode'
,
sessionCode
);
sharedPreferences
.
setString
(
'auth_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'auth_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'auth_userType'
,
userType
);
sharedPreferences
.
setString
(
'auth_stuId'
,
stuId
??
''
);
sharedPreferences
.
setString
(
'auth_stuId'
,
stuId
);
router
.
go
(
'/web'
,
...
...
@@ -215,13 +244,13 @@ class LoginPhoneCubit extends Cubit<LoginPhoneState> {
try
{
_phoneController
.
dispose
();
}
catch
(
e
)
{
print
(
e
);
debugPrint
(
'Error disposing controller:
$e
'
);
}
try
{
_codeController
.
dispose
();
}
catch
(
e
)
{
print
(
e
);
debugPrint
(
'Error disposing controller:
$e
'
);
}
await
super
.
close
();
...
...
lib/bloc/login_qr_cubit.dart
View file @
363514e
...
...
@@ -15,31 +15,41 @@ class LoginQrState extends Equatable {
final
int
status
;
final
Uint8List
?
image
;
final
String
tip
;
final
bool
showSnackBar
;
final
String
snackBarMsg
;
const
LoginQrState
({
this
.
status
=
0
,
this
.
image
,
this
.
tip
=
''
,
this
.
showSnackBar
=
false
,
this
.
snackBarMsg
=
''
,
});
@override
List
<
Object
?>
get
props
=>
[
status
,
image
,
tip
,
];
LoginQrState
copyWith
({
int
?
status
,
Uint8List
?
image
,
String
?
tip
,
bool
?
showSnackBar
,
String
?
snackBarMsg
,
})
{
return
LoginQrState
(
status:
status
??
this
.
status
,
image:
image
??
this
.
image
,
tip:
tip
??
this
.
tip
,
showSnackBar:
showSnackBar
??
this
.
showSnackBar
,
snackBarMsg:
snackBarMsg
??
this
.
snackBarMsg
,
);
}
@override
List
<
Object
?>
get
props
=>
[
status
,
image
,
tip
,
showSnackBar
,
snackBarMsg
,
];
}
class
LoginQrCubit
extends
Cubit
<
LoginQrState
>
{
...
...
@@ -57,13 +67,22 @@ class LoginQrCubit extends Cubit<LoginQrState> {
Future
<
void
>
init
()
async
{
// sdk_ticket
var
result
=
await
_wechatAuthRepository
.
getTicket
();
// 后续添加错误处理
if
(
result
[
'resultCode'
]
!=
'001'
)
{
var
resultData
=
await
_wechatAuthRepository
.
getTicket
()
as
Map
<
String
,
dynamic
>?;
// 请求接口异常
if
(
resultData
==
null
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
'生成二维码失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
var
sdkTicket
=
result
[
'data'
];
// 状态码错误
if
(
resultData
[
'resultCode'
]
!=
'001'
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
'生成二维码状态错误'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
var
sdkTicket
=
resultData
[
'data'
];
// 当前时间戳
var
timestamp
=
DateTime
.
now
().
millisecondsSinceEpoch
;
...
...
@@ -78,7 +97,12 @@ class LoginQrCubit extends Cubit<LoginQrState> {
signature:
signature
,
),
);
print
(
'AuthResult
$authResult
'
);
if
(!
authResult
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
'请求微信失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
}
void
_responseListener
(
WeChatResponse
response
)
async
{
...
...
@@ -122,20 +146,39 @@ class LoginQrCubit extends Cubit<LoginQrState> {
}
Future
<
void
>
_doLogin
(
String
code
)
async
{
dynamic
resultData
=
await
_wechatAuthRepository
.
codeToSk
(
code
);
// 后续添加错误处理
if
(
resultData
[
'resultCode'
]
!=
'001'
)
{
var
resultData
=
await
_wechatAuthRepository
.
codeToSk
(
code
)
as
Map
<
String
,
dynamic
>?;
// 请求接口异常
if
(
resultData
==
null
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
'登录请求处理失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
var
data
=
resultData
[
'data'
];
var
role
=
data
[
'roles'
][
0
];
// 状态码错误
if
(
resultData
[
'resultCode'
]
!=
'001'
)
{
emit
(
state
.
copyWith
(
showSnackBar:
true
,
snackBarMsg:
'登录请求状态失败'
));
emit
(
state
.
copyWith
(
showSnackBar:
false
));
return
;
}
final
sessionCode
=
data
[
'sessionCode'
];
final
userCode
=
data
[
'userCode'
];
var
classCode
=
role
[
'classCode'
];
var
userType
=
role
[
'userType'
];
var
stuId
=
role
[
'stuId'
];
var
data
=
resultData
[
'data'
]
as
Map
<
String
,
dynamic
>;
var
roles
=
data
[
'roles'
];
// 过滤出家长角色的数据
roles
.
removeWhere
((
element
)
=>
element
[
'userType'
]
!=
2
);
var
sessionCode
=
data
[
'sessionCode'
];
var
userCode
=
data
[
'userCode'
];
var
classCode
=
''
;
var
userType
=
0
;
var
stuId
=
''
;
if
(
roles
.
isNotEmpty
)
{
var
role
=
roles
[
0
];
classCode
=
role
[
'classCode'
];
userType
=
role
[
'userType'
];
stuId
=
role
[
'stuId'
];
}
var
sharedPreferences
=
getIt
.
get
<
SharedPreferences
>();
var
preUserCode
=
sharedPreferences
.
getString
(
'pre_userCode'
)
??
''
;
...
...
@@ -144,19 +187,34 @@ class LoginQrCubit extends Cubit<LoginQrState> {
sharedPreferences
.
setString
(
'pre_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'pre_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'pre_userType'
,
userType
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
??
''
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
);
}
else
{
// 前一个登录用户重新登录
classCode
=
sharedPreferences
.
getString
(
'pre_classCode'
);
userType
=
sharedPreferences
.
getInt
(
'pre_userType'
);
stuId
=
sharedPreferences
.
getString
(
'pre_stuId'
);
var
preClassCode
=
sharedPreferences
.
getString
(
'pre_classCode'
)
??
''
;
var
preUserType
=
sharedPreferences
.
getInt
(
'pre_userType'
)
??
0
;
var
preStuId
=
sharedPreferences
.
getString
(
'pre_stuId'
)
??
''
;
if
(
preClassCode
!=
''
&&
roles
.
any
((
element
)
=>
element
[
'classCode'
]
==
preClassCode
&&
element
[
'userType'
]
==
preUserType
&&
element
[
'stuId'
]
==
preStuId
))
{
classCode
=
preClassCode
;
userType
=
preUserType
;
stuId
=
preStuId
;
}
else
{
sharedPreferences
.
setString
(
'pre_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'pre_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'pre_userType'
,
userType
);
sharedPreferences
.
setString
(
'pre_stuId'
,
stuId
);
}
}
sharedPreferences
.
setString
(
'auth_sessionCode'
,
sessionCode
);
sharedPreferences
.
setString
(
'auth_userCode'
,
userCode
);
sharedPreferences
.
setString
(
'auth_classCode'
,
classCode
);
sharedPreferences
.
setInt
(
'auth_userType'
,
userType
);
sharedPreferences
.
setString
(
'auth_stuId'
,
stuId
??
''
);
sharedPreferences
.
setString
(
'auth_stuId'
,
stuId
);
router
.
go
(
'/web'
,
...
...
lib/data/repositories/phone_auth_repository.dart
View file @
363514e
...
...
@@ -84,6 +84,6 @@ class PhoneAuthRepository {
"verifyCode"
:
verifyCode
,
},
);
return
resp
.
data
;
return
resp
.
statusCode
==
200
?
resp
.
data
:
null
;
}
}
lib/data/repositories/wechat_auth_repository.dart
View file @
363514e
import
'package:appframe/config/locator.dart'
;
import
'package:appframe/services/api_service.dart'
;
import
'package:dio/dio.dart'
;
import
'package:flutter/foundation.dart'
;
class
WechatAuthRepository
{
late
final
ApiService
_apiService
;
...
...
@@ -18,9 +19,9 @@ class WechatAuthRepository {
},
);
p
rint
(
'登录结果:
$resp
'
);
debugP
rint
(
'登录结果:
$resp
'
);
return
resp
.
data
;
return
resp
.
statusCode
==
200
?
resp
.
data
:
null
;
}
Future
<
dynamic
>
getTicket
()
async
{
...
...
@@ -32,8 +33,8 @@ class WechatAuthRepository {
},
);
p
rint
(
'获取ticket:
$resp
'
);
debugP
rint
(
'获取ticket:
$resp
'
);
return
resp
.
data
;
return
resp
.
statusCode
==
200
?
resp
.
data
:
null
;
}
}
lib/ui/pages/login_main_page.dart
View file @
363514e
import
'package:appframe/bloc/login_main_cubit.dart'
;
import
'package:appframe/config/locator.dart'
;
import
'package:appframe/ui/widgets/login/login_page_agreed_widget.dart'
;
import
'package:appframe/ui/widgets/tip_overlay_widget.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_bloc/flutter_bloc.dart'
;
import
'package:fluwx/fluwx.dart'
;
...
...
@@ -47,6 +48,7 @@ class LoginMainPage extends StatelessWidget {
if
(
await
getIt
.
get
<
Fluwx
>().
isWeChatInstalled
)
{
loginMainCubit
.
wechatAuth
();
}
else
{
if
(!
context
.
mounted
)
return
;
_showWechatNotInstallDialog
(
context
);
}
},
...
...
@@ -130,6 +132,8 @@ class LoginMainPage extends StatelessWidget {
listener:
(
context
,
state
)
{
if
(
state
.
showAgreed
)
{
_showAgreementDialog
(
context
,
context
.
read
<
LoginMainCubit
>());
}
else
if
(
state
.
showSnackBar
)
{
TipOverlayUtil
.
showTip
(
context
,
state
.
snackBarMsg
);
}
},
),
...
...
lib/ui/pages/login_phone_page.dart
View file @
363514e
import
'package:appframe/bloc/login_phone_cubit.dart'
;
import
'package:appframe/ui/widgets/login/login_page_agreed_widget.dart'
;
import
'package:appframe/ui/widgets/tip_overlay_widget.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/services.dart'
;
import
'package:flutter_bloc/flutter_bloc.dart'
;
...
...
@@ -79,7 +80,7 @@ class LoginPhonePage extends StatelessWidget {
if
(
state
.
showAgreed
)
{
_showAgreementDialog
(
context
,
context
.
read
<
LoginPhoneCubit
>());
}
else
if
(
state
.
showSnackBar
)
{
_
showTip
(
context
,
state
.
snackBarMsg
);
TipOverlayUtil
.
showTip
(
context
,
state
.
snackBarMsg
);
}
},
),
...
...
@@ -381,34 +382,4 @@ class LoginPhonePage extends StatelessWidget {
loginPhoneCubit
.
cancelAgreed
();
}
}
void
_showTip
(
BuildContext
context
,
String
tip
)
{
OverlayEntry
overlayEntry
=
OverlayEntry
(
builder:
(
context
)
=>
Positioned
(
top:
200
,
left:
20
,
right:
20
,
child:
Material
(
color:
Colors
.
transparent
,
child:
Container
(
padding:
EdgeInsets
.
all
(
16
),
decoration:
BoxDecoration
(
color:
Colors
.
black54
,
borderRadius:
BorderRadius
.
circular
(
8
),
),
child:
Text
(
tip
,
style:
TextStyle
(
color:
Colors
.
white
),
textAlign:
TextAlign
.
center
,
),
),
),
),
);
Overlay
.
of
(
context
).
insert
(
overlayEntry
);
Future
.
delayed
(
Duration
(
seconds:
2
),
()
{
overlayEntry
.
remove
();
});
}
}
lib/ui/pages/login_qr_page.dart
View file @
363514e
import
'package:appframe/bloc/login_qr_cubit.dart'
;
import
'package:appframe/ui/widgets/tip_overlay_widget.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter_bloc/flutter_bloc.dart'
;
...
...
@@ -60,7 +61,11 @@ class LoginQrPage extends StatelessWidget {
),
);
},
listener:
(
context
,
state
)
{},
listener:
(
context
,
state
)
{
if
(
state
.
showSnackBar
)
{
TipOverlayUtil
.
showTip
(
context
,
state
.
snackBarMsg
);
}
},
));
}
...
...
lib/ui/widgets/tip_overlay_widget.dart
0 → 100644
View file @
363514e
import
'package:flutter/material.dart'
;
class
TipOverlayUtil
{
static
void
showTip
(
BuildContext
context
,
String
tip
)
{
OverlayEntry
overlayEntry
=
OverlayEntry
(
builder:
(
context
)
=>
Positioned
(
top:
200
,
left:
20
,
right:
20
,
child:
Material
(
color:
Colors
.
transparent
,
child:
Container
(
padding:
EdgeInsets
.
all
(
16
),
decoration:
BoxDecoration
(
color:
Colors
.
black54
,
borderRadius:
BorderRadius
.
circular
(
8
),
),
child:
Text
(
tip
,
style:
TextStyle
(
color:
Colors
.
white
),
textAlign:
TextAlign
.
center
,
),
),
),
),
);
Overlay
.
of
(
context
).
insert
(
overlayEntry
);
Future
.
delayed
(
Duration
(
seconds:
2
),
()
{
overlayEntry
.
remove
();
});
}
}
Write
Preview
Styling with
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment