Toggle navigation
Toggle navigation
This project
Loading...
Sign in
OnePoem
/
OnePoem-App
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
reason
2022-04-01 18:45:22 +0800
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
62f1230ef4cd50f2755f24c356a438b717239f5b
62f1230e
1 parent
ac0f925c
fixed:dio拦截器解析message数据格式问题
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
373 additions
and
193 deletions
lib/generated/intl/messages_en.dart
lib/generated/intl/messages_zh.dart
lib/generated/json/base/json_convert_content.dart
lib/generated/json/category_item_entity.g.dart
lib/generated/json/login_entity.g.dart
lib/generated/json/setting_entity.g.dart
lib/generated/l10n.dart
lib/l10n/intl_en.arb
lib/l10n/intl_zh.arb
lib/login/models/login_entity.dart
lib/login/page/login_page.dart
lib/login/page/register_page.dart
lib/net/dio_utils.dart
lib/net/http_api.dart
lib/net/intercept.dart
lib/generated/intl/messages_en.dart
View file @
62f1230
...
...
@@ -54,8 +54,8 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary
.
simpleMessage
(
"Get verification code"
),
"inputEmailHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"Please enter email address"
),
"inputPasswordHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"Please enter the password
"
),
"inputPasswordHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"Please enter the password(at least 6)
"
),
"inputPhoneHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"Please enter phone number"
),
"inputPhoneInvalid"
:
MessageLookupByLibrary
.
simpleMessage
(
...
...
lib/generated/intl/messages_zh.dart
View file @
62f1230
...
...
@@ -46,7 +46,8 @@ class MessageLookup extends MessageLookupByLibrary {
"forgotPasswordLink"
:
MessageLookupByLibrary
.
simpleMessage
(
"忘记密码"
),
"getVerificationCode"
:
MessageLookupByLibrary
.
simpleMessage
(
"获取验证码"
),
"inputEmailHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"请输入邮箱地址"
),
"inputPasswordHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"请输入密码"
),
"inputPasswordHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"请输入密码(至少6位字母和数字组合)"
),
"inputPhoneHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"请输入手机号"
),
"inputPhoneInvalid"
:
MessageLookupByLibrary
.
simpleMessage
(
"请输入有效的手机号"
),
"inputUsernameHint"
:
MessageLookupByLibrary
.
simpleMessage
(
"请输入账号"
),
...
...
lib/generated/json/base/json_convert_content.dart
View file @
62f1230
...
...
@@ -9,6 +9,8 @@ import 'package:Parlando/category/models/category_item_entity.dart';
import
'package:Parlando/generated/json/category_item_entity.g.dart'
;
import
'package:Parlando/home/models/setting_entity.dart'
;
import
'package:Parlando/generated/json/setting_entity.g.dart'
;
import
'package:Parlando/login/models/login_entity.dart'
;
import
'package:Parlando/generated/json/login_entity.g.dart'
;
import
'package:Parlando/poem/models/lang_sort_entity.dart'
;
import
'package:Parlando/generated/json/lang_sort_entity.g.dart'
;
import
'package:Parlando/poem/models/search_entity.dart'
;
...
...
@@ -102,6 +104,15 @@ class JsonConvert {
if
(
type
==
(
SettingError
).
toString
())
{
return
SettingError
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
LoginEntity
).
toString
())
{
return
LoginEntity
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
LoginData
).
toString
())
{
return
LoginData
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
LoginError
).
toString
())
{
return
LoginError
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
LangSortEntity
).
toString
())
{
return
LangSortEntity
.
fromJson
(
json
)
as
M
;
}
...
...
@@ -113,18 +124,18 @@ class JsonConvert {
}
if
(
type
==
(
SearchItemsOwner
).
toString
())
{
return
SearchItemsOwner
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
SearchItemsLicense
).
toString
())
{
return
SearchItemsLicense
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
FriendEntity
).
toString
())
{
return
FriendEntity
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
FriendData
).
toString
())
{
return
FriendData
.
fromJson
(
json
)
as
M
;
}
}
if
(
type
==
(
SearchItemsLicense
).
toString
())
{
return
SearchItemsLicense
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
FriendEntity
).
toString
())
{
return
FriendEntity
.
fromJson
(
json
)
as
M
;
}
if
(
type
==
(
FriendData
).
toString
())
{
return
FriendData
.
fromJson
(
json
)
as
M
;
}
print
(
"
$type
not found"
);
print
(
"
$type
not found"
);
return
null
;
}
...
...
@@ -165,6 +176,21 @@ class JsonConvert {
(
Map
<
String
,
dynamic
>
e
)
=>
SettingError
.
fromJson
(
e
))
.
toList
()
as
M
;
}
if
(<
LoginEntity
>[]
is
M
)
{
return
data
.
map
<
LoginEntity
>((
Map
<
String
,
dynamic
>
e
)
=>
LoginEntity
.
fromJson
(
e
))
.
toList
()
as
M
;
}
if
(<
LoginData
>[]
is
M
)
{
return
data
.
map
<
LoginData
>((
Map
<
String
,
dynamic
>
e
)
=>
LoginData
.
fromJson
(
e
))
.
toList
()
as
M
;
}
if
(<
LoginError
>[]
is
M
)
{
return
data
.
map
<
LoginError
>((
Map
<
String
,
dynamic
>
e
)
=>
LoginError
.
fromJson
(
e
))
.
toList
()
as
M
;
}
if
(<
LangSortEntity
>[]
is
M
)
{
return
data
.
map
<
LangSortEntity
>(
...
...
@@ -183,19 +209,30 @@ class JsonConvert {
.
toList
()
as
M
;
}
if
(<
SearchItemsOwner
>[]
is
M
)
{
return
data
.
map
<
SearchItemsOwner
>((
Map
<
String
,
dynamic
>
e
)
=>
SearchItemsOwner
.
fromJson
(
e
)).
toList
()
as
M
;
}
if
(<
SearchItemsLicense
>[]
is
M
){
return
data
.
map
<
SearchItemsLicense
>((
Map
<
String
,
dynamic
>
e
)
=>
SearchItemsLicense
.
fromJson
(
e
)).
toList
()
as
M
;
}
if
(<
FriendEntity
>[]
is
M
){
return
data
.
map
<
FriendEntity
>((
Map
<
String
,
dynamic
>
e
)
=>
FriendEntity
.
fromJson
(
e
)).
toList
()
as
M
;
}
if
(<
FriendData
>[]
is
M
){
return
data
.
map
<
FriendData
>((
Map
<
String
,
dynamic
>
e
)
=>
FriendData
.
fromJson
(
e
)).
toList
()
as
M
;
}
return
data
.
map
<
SearchItemsOwner
>(
(
Map
<
String
,
dynamic
>
e
)
=>
SearchItemsOwner
.
fromJson
(
e
))
.
toList
()
as
M
;
}
if
(<
SearchItemsLicense
>[]
is
M
)
{
return
data
.
map
<
SearchItemsLicense
>(
(
Map
<
String
,
dynamic
>
e
)
=>
SearchItemsLicense
.
fromJson
(
e
))
.
toList
()
as
M
;
}
if
(<
FriendEntity
>[]
is
M
)
{
return
data
.
map
<
FriendEntity
>(
(
Map
<
String
,
dynamic
>
e
)
=>
FriendEntity
.
fromJson
(
e
))
.
toList
()
as
M
;
}
if
(<
FriendData
>[]
is
M
)
{
return
data
.
map
<
FriendData
>((
Map
<
String
,
dynamic
>
e
)
=>
FriendData
.
fromJson
(
e
))
.
toList
()
as
M
;
}
print
(
"
${M.toString()}
not found"
);
print
(
"
${M.toString()}
not found"
);
return
null
;
}
...
...
lib/generated/json/category_item_entity.g.dart
View file @
62f1230
...
...
@@ -22,16 +22,16 @@ CategoryItemEntity $CategoryItemEntityFromJson(Map<String, dynamic> json) {
final
String
?
poem
=
jsonConvert
.
convert
<
String
>(
json
[
'poem'
]);
if
(
poem
!=
null
)
{
categoryItemEntity
.
poem
=
poem
;
}
final
String
?
author
=
jsonConvert
.
convert
<
String
>(
json
[
'author'
]);
if
(
author
!=
null
)
{
categoryItemEntity
.
author
=
author
;
}
final
String
?
bgImage
=
jsonConvert
.
convert
<
String
>(
json
[
'bg_image'
]);
if
(
bgImage
!=
null
)
{
categoryItemEntity
.
bgImage
=
bgImage
;
}
return
categoryItemEntity
;
}
final
String
?
author
=
jsonConvert
.
convert
<
String
>(
json
[
'author'
]);
if
(
author
!=
null
)
{
categoryItemEntity
.
author
=
author
;
}
final
String
?
bgImage
=
jsonConvert
.
convert
<
String
>(
json
[
'bg_image'
]);
if
(
bgImage
!=
null
)
{
categoryItemEntity
.
bgImage
=
bgImage
;
}
return
categoryItemEntity
;
}
Map
<
String
,
dynamic
>
$CategoryItemEntityToJson
(
CategoryItemEntity
entity
)
{
...
...
lib/generated/json/login_entity.g.dart
0 → 100644
View file @
62f1230
import
'package:Parlando/generated/json/base/json_convert_content.dart'
;
import
'package:Parlando/login/models/login_entity.dart'
;
LoginEntity
$LoginEntityFromJson
(
Map
<
String
,
dynamic
>
json
)
{
final
LoginEntity
loginEntity
=
LoginEntity
();
final
String
?
status
=
jsonConvert
.
convert
<
String
>(
json
[
'status'
]);
if
(
status
!=
null
)
{
loginEntity
.
status
=
status
;
}
final
int
?
code
=
jsonConvert
.
convert
<
int
>(
json
[
'code'
]);
if
(
code
!=
null
)
{
loginEntity
.
code
=
code
;
}
final
String
?
message
=
jsonConvert
.
convert
<
String
>(
json
[
'message'
]);
if
(
message
!=
null
)
{
loginEntity
.
message
=
message
;
}
final
LoginData
?
data
=
jsonConvert
.
convert
<
LoginData
>(
json
[
'data'
]);
if
(
data
!=
null
)
{
loginEntity
.
data
=
data
;
}
final
LoginError
?
error
=
jsonConvert
.
convert
<
LoginError
>(
json
[
'error'
]);
if
(
error
!=
null
)
{
loginEntity
.
error
=
error
;
}
return
loginEntity
;
}
Map
<
String
,
dynamic
>
$LoginEntityToJson
(
LoginEntity
entity
)
{
final
Map
<
String
,
dynamic
>
data
=
<
String
,
dynamic
>{};
data
[
'status'
]
=
entity
.
status
;
data
[
'code'
]
=
entity
.
code
;
data
[
'message'
]
=
entity
.
message
;
data
[
'data'
]
=
entity
.
data
?.
toJson
();
data
[
'error'
]
=
entity
.
error
?.
toJson
();
return
data
;
}
LoginData
$LoginDataFromJson
(
Map
<
String
,
dynamic
>
json
)
{
final
LoginData
loginData
=
LoginData
();
final
String
?
token
=
jsonConvert
.
convert
<
String
>(
json
[
'token'
]);
if
(
token
!=
null
)
{
loginData
.
token
=
token
;
}
return
loginData
;
}
Map
<
String
,
dynamic
>
$LoginDataToJson
(
LoginData
entity
)
{
final
Map
<
String
,
dynamic
>
data
=
<
String
,
dynamic
>{};
data
[
'token'
]
=
entity
.
token
;
return
data
;
}
LoginError
$LoginErrorFromJson
(
Map
<
String
,
dynamic
>
json
)
{
final
LoginError
loginError
=
LoginError
();
return
loginError
;
}
Map
<
String
,
dynamic
>
$LoginErrorToJson
(
LoginError
entity
)
{
final
Map
<
String
,
dynamic
>
data
=
<
String
,
dynamic
>{};
return
data
;
}
lib/generated/json/setting_entity.g.dart
View file @
62f1230
...
...
@@ -88,4 +88,4 @@ SettingError $SettingErrorFromJson(Map<String, dynamic> json) {
Map
<
String
,
dynamic
>
$SettingErrorToJson
(
SettingError
entity
)
{
final
Map
<
String
,
dynamic
>
data
=
<
String
,
dynamic
>{};
return
data
;
}
}
\ No newline at end of file
...
...
lib/generated/l10n.dart
View file @
62f1230
...
...
@@ -100,12 +100,12 @@ class S {
);
}
/// `Please enter the password`
/// `Please enter the password
(at least 6)
`
String
get
inputPasswordHint
{
return
Intl
.
message
(
'Please enter the password'
,
'Please enter the password
(at least 6)
'
,
name:
'inputPasswordHint'
,
desc:
'Please enter the password'
,
desc:
'Please enter the password
(at least 6)
'
,
args:
[],
);
}
...
...
lib/l10n/intl_en.arb
View file @
62f1230
...
...
@@ -30,9 +30,9 @@
"type"
:
"text"
,
"placeholders"
:
{}
},
"inputPasswordHint"
:
"Please enter the password"
,
"inputPasswordHint"
:
"Please enter the password
(at least 6)
"
,
"@inputPasswordHint"
:
{
"description"
:
"Please enter the password"
,
"description"
:
"Please enter the password
(at least 6)
"
,
"type"
:
"text"
,
"placeholders"
:
{}
},
...
...
@@ -137,7 +137,6 @@
"type"
:
"text"
,
"placeholders"
:
{}
},
"accountEditPageUserInfo"
:
"User Info"
,
"@accountEditPageTitle"
:
{
"description"
:
"User Info"
,
...
...
lib/l10n/intl_zh.arb
View file @
62f1230
...
...
@@ -4,7 +4,7 @@
"passwordLogin"
:
"密码登录"
,
"login"
:
"登录"
,
"forgotPasswordLink"
:
"忘记密码"
,
"inputPasswordHint"
:
"请输入密码"
,
"inputPasswordHint"
:
"请输入密码
(至少6位字母和数字组合)
"
,
"inputUsernameHint"
:
"请输入账号"
,
"noAccountRegisterLink"
:
"还没账号?快去注册"
,
"register"
:
"注册"
,
...
...
lib/login/models/login_entity.dart
0 → 100644
View file @
62f1230
import
'dart:convert'
;
import
'package:Parlando/generated/json/base/json_field.dart'
;
import
'package:Parlando/generated/json/login_entity.g.dart'
;
@JsonSerializable
()
class
LoginEntity
{
String
?
status
;
int
?
code
;
String
?
message
;
LoginData
?
data
;
LoginError
?
error
;
LoginEntity
();
factory
LoginEntity
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
=>
$LoginEntityFromJson
(
json
);
Map
<
String
,
dynamic
>
toJson
()
=>
$LoginEntityToJson
(
this
);
@override
String
toString
()
{
return
jsonEncode
(
this
);
}
}
@JsonSerializable
()
class
LoginData
{
String
?
token
;
LoginData
();
factory
LoginData
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
=>
$LoginDataFromJson
(
json
);
Map
<
String
,
dynamic
>
toJson
()
=>
$LoginDataToJson
(
this
);
@override
String
toString
()
{
return
jsonEncode
(
this
);
}
}
@JsonSerializable
()
class
LoginError
{
LoginError
();
factory
LoginError
.
fromJson
(
Map
<
String
,
dynamic
>
json
)
=>
$LoginErrorFromJson
(
json
);
Map
<
String
,
dynamic
>
toJson
()
=>
$LoginErrorToJson
(
this
);
@override
String
toString
()
{
return
jsonEncode
(
this
);
}
}
lib/login/page/login_page.dart
View file @
62f1230
import
'package:Parlando/login/models/login_entity.dart'
;
import
'package:Parlando/net/dio_utils.dart'
;
import
'package:Parlando/net/http_api.dart'
;
import
'package:Parlando/util/toast_utils.dart'
;
import
'package:flustars/flustars.dart'
;
import
'package:flutter/cupertino.dart'
;
import
'package:flutter/gestures.dart'
;
import
'package:flutter/material.dart'
;
import
'package:flutter/services.dart'
;
...
...
@@ -16,6 +19,7 @@ import 'package:Parlando/util/other_utils.dart';
import
'package:Parlando/widgets/my_app_bar.dart'
;
import
'package:Parlando/widgets/my_button.dart'
;
import
'package:Parlando/widgets/my_scroll_view.dart'
;
import
'package:getwidget/getwidget.dart'
;
import
'../login_router.dart'
;
...
...
@@ -40,7 +44,7 @@ class _LoginPageState extends State<LoginPage>
final
FocusNode
_nodeText1
=
FocusNode
();
final
FocusNode
_nodeText2
=
FocusNode
();
bool
_clickable
=
false
;
bool
isLogin
=
false
;
bool
_isLoading
=
false
;
@override
Map
<
ChangeNotifier
,
List
<
VoidCallback
>?>?
changeNotifier
()
{
...
...
@@ -72,7 +76,7 @@ class _LoginPageState extends State<LoginPage>
Future
.
delayed
(
Duration
.
zero
,
()
{
()
{
NavigatorUtils
.
pushPageByFade
(
context:
context
,
//目标页面
...
...
@@ -106,7 +110,7 @@ class _LoginPageState extends State<LoginPage>
final
String
name
=
_nameController
.
text
;
final
String
password
=
_passwordController
.
text
;
bool
clickable
=
true
;
if
(
name
.
isEmpty
||
name
.
length
<
11
)
{
if
(
name
.
isEmpty
||
name
.
length
<
5
)
{
clickable
=
false
;
}
if
(
password
.
isEmpty
||
password
.
length
<
6
)
{
...
...
@@ -122,13 +126,28 @@ class _LoginPageState extends State<LoginPage>
}
void
_login
()
{
isLogin
=
true
;
setState
(()
{});
Future
.
delayed
(
const
Duration
(
seconds:
2
),
()
{
//TODO 接入接口后获得user token则表明登录成功
SpUtil
.
putString
(
Constant
.
userToken
,
"this is user token!"
);
NavigatorUtils
.
push
(
context
,
Routes
.
home
,
clearStack:
true
);
});
_isLoading
=
true
;
setState
(()
{});
Map
<
String
,
String
>
params
=
<
String
,
String
>{
"email"
:
_nameController
.
text
,
"password"
:
_passwordController
.
text
,
};
DioUtils
.
instance
.
asyncRequestNetwork
<
LoginEntity
>(
Method
.
post
,
HttpApi
.
login
,
params:
params
,
onSuccess:
(
data
)
{
SpUtil
.
putString
(
Constant
.
userToken
,
data
!.
data
!.
token
!);
NavigatorUtils
.
push
(
context
,
Routes
.
home
,
clearStack:
true
);
_isLoading
=
false
;
},
onError:
(
code
,
msg
)
{
Toast
.
show
(
msg
.
toString
());
_isLoading
=
false
;
setState
(()
{});
},
);
}
@override
...
...
@@ -167,112 +186,108 @@ class _LoginPageState extends State<LoginPage>
),
children:
_buildBody
,
),
isLogin
?
const
Center
(
child:
CupertinoActivityIndicator
(
radius:
16.0
,
),
)
:
Container
(),
Container
(
child:
_isLoading
?
const
GFLoader
()
:
null
,
),
],
),
);
}
List
<
Widget
>
get
_buildBody
=>
<
Widget
>[
Text
(
ParlandoLocalizations
.
of
(
context
).
passwordLogin
,
style:
TextStyles
.
textBold26
,
),
Gaps
.
vGap16
,
MyTextField
(
key:
const
Key
(
'phone
'
),
Text
(
ParlandoLocalizations
.
of
(
context
).
passwordLogin
,
style:
TextStyles
.
textBold26
,
),
Gaps
.
vGap16
,
MyTextField
(
key:
const
Key
(
'email
'
),
focusNode:
_nodeText1
,
controller:
_nameController
,
maxLength:
1
1
,
keyboardType:
TextInputType
.
phone
,
hintText:
ParlandoLocalizations
.
of
(
context
).
input
Username
Hint
,
maxLength:
1
00
,
keyboardType:
TextInputType
.
emailAddress
,
hintText:
ParlandoLocalizations
.
of
(
context
).
input
Email
Hint
,
),
Gaps
.
vGap8
,
MyTextField
(
key:
const
Key
(
'password'
),
keyName:
'password'
,
focusNode:
_nodeText2
,
isInputPwd:
true
,
controller:
_passwordController
,
keyboardType:
TextInputType
.
visiblePassword
,
hintText:
ParlandoLocalizations
.
of
(
context
).
inputPasswordHint
,
),
Gaps
.
vGap24
,
Text
.
rich
(
TextSpan
(
text:
'登录即代表同意并阅读'
,
style:
const
TextStyle
(
fontSize:
12
,
color:
Color
(
0xFF999999
)),
children:
[
TextSpan
(
text:
'《用户协议》'
,
style:
TextStyle
(
color:
Theme
.
of
(
context
).
primaryColor
),
recognizer:
TapGestureRecognizer
()
..
onTap
=
()
{
Navigator
.
of
(
context
)
.
push
(
MaterialPageRoute
(
builder:
(
context
)
{
Gaps
.
vGap8
,
MyTextField
(
key:
const
Key
(
'password'
),
keyName:
'password'
,
focusNode:
_nodeText2
,
isInputPwd:
true
,
controller:
_passwordController
,
keyboardType:
TextInputType
.
visiblePassword
,
hintText:
ParlandoLocalizations
.
of
(
context
).
inputPasswordHint
,
),
Gaps
.
vGap24
,
Text
.
rich
(
TextSpan
(
text:
'登录即代表同意并阅读'
,
style:
const
TextStyle
(
fontSize:
12
,
color:
Color
(
0xFF999999
)),
children:
[
TextSpan
(
text:
'《用户协议》'
,
style:
TextStyle
(
color:
Theme
.
of
(
context
).
primaryColor
),
recognizer:
TapGestureRecognizer
()
..
onTap
=
()
{
Navigator
.
of
(
context
)
.
push
(
MaterialPageRoute
(
builder:
(
context
)
{
return
const
WebViewPage
(
title:
'《用户协议》'
,
url:
Constant
.
protocolUrl
,
);
}));
},
),
const
TextSpan
(
text:
' & '
),
TextSpan
(
text:
'《隐私政策》'
,
style:
TextStyle
(
color:
Theme
.
of
(
context
).
primaryColor
),
recognizer:
TapGestureRecognizer
()
..
onTap
=
()
{
Navigator
.
of
(
context
).
push
(
MaterialPageRoute
(
builder:
(
context
)
{
return
const
WebViewPage
(
title:
'《
用户协议
》'
,
url:
Constant
.
pr
otocol
Url
,
title:
'《
隐私政策
》'
,
url:
Constant
.
pr
ivacy
Url
,
);
}));
},
),
const
TextSpan
(
text:
' & '
),
TextSpan
(
text:
'《隐私政策》'
,
style:
TextStyle
(
color:
Theme
.
of
(
context
).
primaryColor
),
recognizer:
TapGestureRecognizer
()
..
onTap
=
()
{
Navigator
.
of
(
context
).
push
(
MaterialPageRoute
(
builder:
(
context
)
{
return
const
WebViewPage
(
title:
'《隐私政策》'
,
url:
Constant
.
privacyUrl
,
);
},
),
);
},
),
]),
),
Gaps
.
vGap16
,
MyButton
(
key:
const
Key
(
'login'
),
onPressed:
_clickable
?
_login
:
null
,
text:
ParlandoLocalizations
.
of
(
context
).
login
,
),
Container
(
height:
40
.
px
,
alignment:
Alignment
.
centerRight
,
child:
GestureDetector
(
child:
Text
(
ParlandoLocalizations
.
of
(
context
).
forgotPasswordLink
,
key:
const
Key
(
'forgotPassword'
),
style:
Theme
.
of
(
context
).
textTheme
.
subtitle2
,
},
),
);
},
),
onTap:
()
=>
NavigatorUtils
.
push
(
context
,
LoginRouter
.
resetPasswordPage
),
),
]),
),
Gaps
.
vGap16
,
MyButton
(
key:
const
Key
(
'login'
),
onPressed:
_clickable
?
_login
:
null
,
text:
ParlandoLocalizations
.
of
(
context
).
login
,
),
Container
(
height:
40
.
px
,
alignment:
Alignment
.
centerRight
,
child:
GestureDetector
(
child:
Text
(
ParlandoLocalizations
.
of
(
context
).
forgotPasswordLink
,
key:
const
Key
(
'forgotPassword'
),
style:
Theme
.
of
(
context
).
textTheme
.
subtitle2
,
),
Gaps
.
vGap16
,
Container
(
alignment:
Alignment
.
center
,
child:
GestureDetector
(
child:
Text
(
ParlandoLocalizations
.
of
(
context
).
noAccountRegisterLink
,
key:
const
Key
(
'noAccountRegister'
),
style:
TextStyle
(
color:
Theme
.
of
(
context
).
primaryColor
),
),
onTap:
()
=>
NavigatorUtils
.
push
(
context
,
LoginRouter
.
registerPage
),
))
];
onTap:
()
=>
NavigatorUtils
.
push
(
context
,
LoginRouter
.
resetPasswordPage
),
),
),
Gaps
.
vGap16
,
Container
(
alignment:
Alignment
.
center
,
child:
GestureDetector
(
child:
Text
(
ParlandoLocalizations
.
of
(
context
).
noAccountRegisterLink
,
key:
const
Key
(
'noAccountRegister'
),
style:
TextStyle
(
color:
Theme
.
of
(
context
).
primaryColor
),
),
onTap:
()
=>
NavigatorUtils
.
push
(
context
,
LoginRouter
.
registerPage
),
))
];
}
...
...
lib/login/page/register_page.dart
View file @
62f1230
...
...
@@ -59,7 +59,7 @@ class _RegisterPageState extends State<RegisterPage>
final
String
vCode
=
_vCodeController
.
text
;
final
String
password
=
_passwordController
.
text
;
bool
clickable
=
true
;
if
(
name
.
isEmpty
||
name
.
length
<
11
)
{
if
(
name
.
isEmpty
||
name
.
length
<
5
)
{
clickable
=
false
;
}
if
(
vCode
.
isEmpty
||
vCode
.
length
<
6
)
{
...
...
@@ -95,6 +95,7 @@ class _RegisterPageState extends State<RegisterPage>
onError:
(
code
,
msg
)
{
Toast
.
show
(
msg
);
_isLoading
=
false
;
setState
(()
{});
},
);
}
...
...
@@ -123,7 +124,7 @@ class _RegisterPageState extends State<RegisterPage>
),
Gaps
.
vGap16
,
MyTextField
(
key:
const
Key
(
'
phone
'
),
key:
const
Key
(
'
email
'
),
focusNode:
_nodeText1
,
controller:
_nameController
,
maxLength:
100
,
...
...
lib/net/dio_utils.dart
View file @
62f1230
...
...
@@ -35,7 +35,6 @@ typedef NetErrorCallback = Function(int code, String msg);
/// @weilu https://github.com/simplezhli
class
DioUtils
{
factory
DioUtils
()
=>
_singleton
;
DioUtils
.
_
()
{
...
...
@@ -43,6 +42,7 @@ class DioUtils {
connectTimeout:
_connectTimeout
,
receiveTimeout:
_receiveTimeout
,
sendTimeout:
_sendTimeout
,
/// dio默认json解析,这里指定返回UTF8字符串,自己处理解析。(可也以自定义Transformer实现)
responseType:
ResponseType
.
plain
,
validateStatus:
(
_
)
{
...
...
@@ -53,6 +53,7 @@ class DioUtils {
// contentType: Headers.formUrlEncodedContentType, // 适用于post form表单提交
);
_dio
=
Dio
(
_options
);
/// Fiddler抓包代理配置 https://www.jianshu.com/p/d831b1f7c45b
// (_dio.httpClientAdapter as DefaultHttpClientAdapter).onHttpClientCreate =
// (HttpClient client) {
...
...
@@ -68,6 +69,7 @@ class DioUtils {
void
addInterceptor
(
Interceptor
interceptor
)
{
_dio
.
interceptors
.
add
(
interceptor
);
}
_interceptors
.
forEach
(
addInterceptor
);
}
...
...
@@ -80,7 +82,9 @@ class DioUtils {
Dio
get
dio
=>
_dio
;
// 数据返回格式统一,统一处理异常
Future
<
BaseEntity
<
T
>>
_request
<
T
>(
String
method
,
String
url
,
{
Future
<
BaseEntity
<
T
>>
_request
<
T
>(
String
method
,
String
url
,
{
Object
?
data
,
Map
<
String
,
dynamic
>?
queryParameters
,
CancelToken
?
cancelToken
,
...
...
@@ -95,14 +99,16 @@ class DioUtils {
);
try
{
final
String
data
=
response
.
data
.
toString
();
/// 集成测试无法使用 isolate https://github.com/flutter/flutter/issues/24703
/// 使用compute条件:数据大于10KB(粗略使用10 * 1024)且当前不是集成测试(后面可能会根据Web环境进行调整)
/// 主要目的减少不必要的性能开销
final
bool
isCompute
=
!
Constant
.
isDriverTest
&&
data
.
length
>
10
*
1024
;
debugPrint
(
'isCompute:
$isCompute
'
);
final
Map
<
String
,
dynamic
>
_map
=
isCompute
?
await
compute
(
parseData
,
data
)
:
parseData
(
data
);
final
Map
<
String
,
dynamic
>
_map
=
isCompute
?
await
compute
(
parseData
,
data
)
:
parseData
(
data
);
return
BaseEntity
<
T
>.
fromJson
(
_map
);
}
catch
(
e
)
{
}
catch
(
e
)
{
debugPrint
(
e
.
toString
());
return
BaseEntity
<
T
>(
ExceptionHandle
.
parse_error
,
'数据解析错误!'
,
null
);
}
...
...
@@ -114,7 +120,9 @@ class DioUtils {
return
options
;
}
Future
requestNetwork
<
T
>(
Method
method
,
String
url
,
{
Future
requestNetwork
<
T
>(
Method
method
,
String
url
,
{
NetSuccessCallback
<
T
?>?
onSuccess
,
NetErrorCallback
?
onError
,
Object
?
params
,
...
...
@@ -122,7 +130,9 @@ class DioUtils {
CancelToken
?
cancelToken
,
Options
?
options
,
})
{
return
_request
<
T
>(
method
.
value
,
url
,
return
_request
<
T
>(
method
.
value
,
url
,
data:
params
,
queryParameters:
queryParameters
,
options:
options
,
...
...
@@ -141,7 +151,9 @@ class DioUtils {
}
/// 统一处理(onSuccess返回T对象,onSuccessList返回 List<T>)
void
asyncRequestNetwork
<
T
>(
Method
method
,
String
url
,
{
void
asyncRequestNetwork
<
T
>(
Method
method
,
String
url
,
{
NetSuccessCallback
<
T
?>?
onSuccess
,
NetErrorCallback
?
onError
,
Object
?
params
,
...
...
@@ -149,13 +161,14 @@ class DioUtils {
CancelToken
?
cancelToken
,
Options
?
options
,
})
{
Stream
.
fromFuture
(
_request
<
T
>(
method
.
value
,
url
,
Stream
.
fromFuture
(
_request
<
T
>(
method
.
value
,
url
,
data:
params
,
queryParameters:
queryParameters
,
options:
options
,
cancelToken:
cancelToken
,
)).
asBroadcastStream
()
.
listen
((
result
)
{
)).
asBroadcastStream
().
listen
((
result
)
{
if
(
result
.
code
==
0
)
{
if
(
onSuccess
!=
null
)
{
onSuccess
(
result
.
data
);
...
...
@@ -190,14 +203,7 @@ Map<String, dynamic> parseData(String data) {
return
json
.
decode
(
data
)
as
Map
<
String
,
dynamic
>;
}
enum
Method
{
get
,
post
,
put
,
patch
,
delete
,
head
}
enum
Method
{
get
,
post
,
put
,
patch
,
delete
,
head
}
/// 使用拓展枚举替代 switch判断取值
/// https://zhuanlan.zhihu.com/p/98545689
...
...
lib/net/http_api.dart
View file @
62f1230
...
...
@@ -2,6 +2,7 @@ class HttpApi {
static
const
String
setting
=
'setting'
;
static
const
String
register
=
'register'
;
static
const
String
verify
=
'verify'
;
static
const
String
login
=
'login'
;
static
const
String
search
=
'search/repositories'
;
static
const
String
subscriptions
=
'users/simplezhli/subscriptions'
;
static
const
String
upload
=
'uuc/upload-inco'
;
...
...
lib/net/intercept.dart
View file @
62f1230
...
...
@@ -27,28 +27,29 @@ class AuthInterceptor extends Interceptor {
}
class
TokenInterceptor
extends
Interceptor
{
Dio
?
_tokenDio
;
Future
<
String
?>
getToken
()
async
{
final
Map
<
String
,
String
>
params
=
<
String
,
String
>{};
params
[
'refresh_token'
]
=
SpUtil
.
getString
(
Constant
.
refreshToken
).
nullSafe
;
try
{
_tokenDio
??=
Dio
();
_tokenDio
!.
options
=
DioUtils
.
instance
.
dio
.
options
;
final
Response
response
=
await
_tokenDio
!.
post
<
dynamic
>(
'lgn/refreshToken'
,
data:
params
);
final
Response
response
=
await
_tokenDio
!.
post
<
dynamic
>(
'lgn/refreshToken'
,
data:
params
);
if
(
response
.
statusCode
==
ExceptionHandle
.
success
)
{
return
(
json
.
decode
(
response
.
data
.
toString
())
as
Map
<
String
,
dynamic
>)[
'access_token'
]
as
String
;
return
(
json
.
decode
(
response
.
data
.
toString
())
as
Map
<
String
,
dynamic
>)[
'access_token'
]
as
String
;
}
}
catch
(
e
)
{
}
catch
(
e
)
{
Log
.
e
(
'刷新Token失败!'
);
}
return
null
;
}
@override
Future
<
void
>
onResponse
(
Response
response
,
ResponseInterceptorHandler
handler
)
async
{
Future
<
void
>
onResponse
(
Response
response
,
ResponseInterceptorHandler
handler
)
async
{
//401代表token过期
if
(
response
.
statusCode
==
ExceptionHandle
.
unauthorized
)
{
Log
.
d
(
'-----------自动刷新Token------------'
);
...
...
@@ -71,8 +72,10 @@ class TokenInterceptor extends Interceptor {
try
{
Log
.
e
(
'----------- 重新请求接口 ------------'
);
/// 避免重复执行拦截器,使用tokenDio
final
Response
response
=
await
_tokenDio
!.
request
<
dynamic
>(
request
.
path
,
final
Response
response
=
await
_tokenDio
!.
request
<
dynamic
>(
request
.
path
,
data:
request
.
data
,
queryParameters:
request
.
queryParameters
,
cancelToken:
request
.
cancelToken
,
...
...
@@ -89,11 +92,10 @@ class TokenInterceptor extends Interceptor {
}
}
class
LoggingInterceptor
extends
Interceptor
{
class
LoggingInterceptor
extends
Interceptor
{
late
DateTime
_startTime
;
late
DateTime
_endTime
;
@override
void
onRequest
(
RequestOptions
options
,
RequestInterceptorHandler
handler
)
{
_startTime
=
DateTime
.
now
();
...
...
@@ -101,7 +103,8 @@ class LoggingInterceptor extends Interceptor{
if
(
options
.
queryParameters
.
isEmpty
)
{
Log
.
d
(
'RequestUrl:
${options.baseUrl}${options.path}
'
);
}
else
{
Log
.
d
(
'RequestUrl:
${options.baseUrl}${options.path}
?
${Transformer.urlEncodeMap(options.queryParameters)}
'
);
Log
.
d
(
'RequestUrl:
${options.baseUrl}${options.path}
?
${Transformer.urlEncodeMap(options.queryParameters)}
'
);
}
Log
.
d
(
'RequestMethod:
${options.method}
'
);
Log
.
d
(
'RequestHeaders:
${options.headers}
'
);
...
...
@@ -109,7 +112,7 @@ class LoggingInterceptor extends Interceptor{
Log
.
d
(
'RequestData:
${options.data.toString()}
'
);
super
.
onRequest
(
options
,
handler
);
}
@override
void
onResponse
(
Response
response
,
ResponseInterceptorHandler
handler
)
{
_endTime
=
DateTime
.
now
();
...
...
@@ -124,7 +127,7 @@ class LoggingInterceptor extends Interceptor{
Log
.
d
(
'----------End:
$duration
毫秒----------'
);
super
.
onResponse
(
response
,
handler
);
}
@override
void
onError
(
DioError
err
,
ErrorInterceptorHandler
handler
)
{
Log
.
d
(
'----------Error-----------'
);
...
...
@@ -132,8 +135,7 @@ class LoggingInterceptor extends Interceptor{
}
}
class
AdapterInterceptor
extends
Interceptor
{
class
AdapterInterceptor
extends
Interceptor
{
static
const
String
_kMsg
=
'msg'
;
static
const
String
_kSlash
=
"'"
;
static
const
String
_kMessage
=
'message'
;
...
...
@@ -143,13 +145,13 @@ class AdapterInterceptor extends Interceptor{
static
const
String
_kFailureFormat
=
'{"code":%d,"message":"%s"}'
;
static
const
String
_kSuccessFormat
=
'{"code":0,"data":%s,"message":""}'
;
@override
void
onResponse
(
Response
response
,
ResponseInterceptorHandler
handler
)
{
final
Response
r
=
adapterData
(
response
);
super
.
onResponse
(
r
,
handler
);
}
@override
void
onError
(
DioError
err
,
ErrorInterceptorHandler
handler
)
{
if
(
err
.
response
!=
null
)
{
...
...
@@ -161,8 +163,10 @@ class AdapterInterceptor extends Interceptor{
Response
adapterData
(
Response
response
)
{
String
result
;
String
content
=
response
.
data
?.
toString
()
??
''
;
/// 成功时,直接格式化返回
if
(
response
.
statusCode
==
ExceptionHandle
.
success
||
response
.
statusCode
==
ExceptionHandle
.
success_not_content
)
{
if
(
response
.
statusCode
==
ExceptionHandle
.
success
||
response
.
statusCode
==
ExceptionHandle
.
success_not_content
)
{
if
(
content
.
isEmpty
)
{
content
=
_kDefaultText
;
}
...
...
@@ -180,11 +184,8 @@ class AdapterInterceptor extends Interceptor{
}
else
{
String
msg
;
try
{
content
=
content
.
replaceAll
(
r'\'
,
''
);
if
(
_kSlash
==
content
.
substring
(
0
,
1
))
{
content
=
content
.
substring
(
1
,
content
.
length
-
1
);
}
final
Map
<
String
,
dynamic
>
map
=
json
.
decode
(
content
)
as
Map
<
String
,
dynamic
>;
final
Map
<
String
,
dynamic
>
map
=
json
.
decode
(
content
)
as
Map
<
String
,
dynamic
>;
if
(
map
.
containsKey
(
_kMessage
))
{
msg
=
map
[
_kMessage
]
as
String
;
}
else
if
(
map
.
containsKey
(
_kMsg
))
{
...
...
@@ -202,7 +203,8 @@ class AdapterInterceptor extends Interceptor{
}
catch
(
e
)
{
// Log.d('异常信息:$e');
// 解析异常直接按照返回原数据处理(一般为返回500,503 HTML页面代码)
result
=
sprintf
(
_kFailureFormat
,
[
response
.
statusCode
,
'服务器异常(
${response.statusCode}
)'
]);
result
=
sprintf
(
_kFailureFormat
,
[
response
.
statusCode
,
'服务器异常(
${response.statusCode}
)'
]);
}
}
}
...
...
Please
register
or
login
to post a comment