登录页支持切换账号

This commit is contained in:
jyuesong
2022-01-24 13:51:42 +08:00
parent fdde0037f9
commit e4abb578f0
7 changed files with 449 additions and 405 deletions

View File

@@ -1,3 +1,7 @@
## v1.0.6
* 支持切换账号功能
* 登录页青龙图标颜色随颜色主题变换
## v1.0.5 ## v1.0.5
* 优化配置文件编辑功能 * 优化配置文件编辑功能
* 优化文本选择样式 * 优化文本选择样式
@@ -18,6 +22,7 @@
* 解决2.10.12及以下版本无法登录的问题 * 解决2.10.12及以下版本无法登录的问题
* 适配最新版qinglong 相关接口字段 * 适配最新版qinglong 相关接口字段
* 其他页面排版优化
## 1.0.2 ## 1.0.2

View File

@@ -7,7 +7,7 @@ import 'package:qinglong_app/module/env/env_detail_page.dart';
import 'package:qinglong_app/module/home/home_page.dart'; import 'package:qinglong_app/module/home/home_page.dart';
import 'package:qinglong_app/module/login/login_page.dart'; import 'package:qinglong_app/module/login/login_page.dart';
import 'package:qinglong_app/module/others/about_page.dart'; import 'package:qinglong_app/module/others/about_page.dart';
import 'package:qinglong_app/module/others/change_account.dart'; import 'package:qinglong_app/module/others/change_account_page.dart';
import 'package:qinglong_app/module/others/dependencies/add_dependency_page.dart'; import 'package:qinglong_app/module/others/dependencies/add_dependency_page.dart';
import 'package:qinglong_app/module/others/dependencies/dependency_page.dart'; import 'package:qinglong_app/module/others/dependencies/dependency_page.dart';
import 'package:qinglong_app/module/others/login_log/login_log_page.dart'; import 'package:qinglong_app/module/others/login_log/login_log_page.dart';

View File

@@ -208,6 +208,7 @@ class ThemeViewModel extends ChangeNotifier {
abstract class ThemeColors { abstract class ThemeColors {
Color settingBgColor(); Color settingBgColor();
Color settingBordorColor();
Color titleColor(); Color titleColor();
@@ -250,6 +251,11 @@ class LightThemeColors extends ThemeColors {
Color buttonBgColor() { Color buttonBgColor() {
return _primaryColor; return _primaryColor;
} }
@override
Color settingBordorColor() {
return Colors.white;
}
} }
class DartThemeColors extends ThemeColors { class DartThemeColors extends ThemeColors {
@@ -282,4 +288,9 @@ class DartThemeColors extends ThemeColors {
Color buttonBgColor() { Color buttonBgColor() {
return const Color(0xff333333); return const Color(0xff333333);
} }
@override
Color settingBordorColor() {
return Color(0xff333333);
}
} }

View File

@@ -185,7 +185,7 @@ class _HomePageState extends ConsumerState<HomePage> {
IndexBean( IndexBean(
CupertinoIcons.cube, CupertinoIcons.cube,
CupertinoIcons.cube_fill, CupertinoIcons.cube_fill,
"其他", "其他功能",
), ),
); );
} }

View File

@@ -45,8 +45,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
if (!widget.doNotLoadLocalData) { if (!widget.doNotLoadLocalData) {
_hostController.text = getIt<UserInfoViewModel>().host ?? ""; _hostController.text = getIt<UserInfoViewModel>().host ?? "";
useSecretLogin = getIt<UserInfoViewModel>().useSecretLogined; useSecretLogin = getIt<UserInfoViewModel>().useSecretLogined;
if (getIt<UserInfoViewModel>().userName != null && if (getIt<UserInfoViewModel>().userName != null && getIt<UserInfoViewModel>().userName!.isNotEmpty) {
getIt<UserInfoViewModel>().userName!.isNotEmpty) {
if (getIt<UserInfoViewModel>().useSecretLogined) { if (getIt<UserInfoViewModel>().useSecretLogined) {
_cIdController.text = getIt<UserInfoViewModel>().userName!; _cIdController.text = getIt<UserInfoViewModel>().userName!;
} else { } else {
@@ -56,8 +55,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
} else { } else {
rememberPassword = false; rememberPassword = false;
} }
if (getIt<UserInfoViewModel>().passWord != null && if (getIt<UserInfoViewModel>().passWord != null && getIt<UserInfoViewModel>().passWord!.isNotEmpty) {
getIt<UserInfoViewModel>().passWord!.isNotEmpty) {
if (getIt<UserInfoViewModel>().useSecretLogined) { if (getIt<UserInfoViewModel>().useSecretLogined) {
_cSecretController.text = getIt<UserInfoViewModel>().passWord!; _cSecretController.text = getIt<UserInfoViewModel>().passWord!;
} else { } else {
@@ -76,313 +74,335 @@ class _LoginPageState extends ConsumerState<LoginPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return ColoredBox( return SafeArea(
color: ref.watch(themeProvider).themeColor.settingBgColor(), child: ColoredBox(
child: SizedBox( color: ref.watch(themeProvider).themeColor.settingBgColor(),
height: MediaQuery.of(context).size.height, child: SizedBox(
child: Stack( height: MediaQuery.of(context).size.height,
children: [ child: Stack(
Positioned( children: [
bottom: 0, Positioned(
child: Image.asset( bottom: 0,
"assets/images/login_bg.png", child: Image.asset(
width: MediaQuery.of(context).size.width, "assets/images/login_bg.png",
width: MediaQuery.of(context).size.width,
),
), ),
), Scaffold(
Scaffold( backgroundColor: Colors.transparent,
backgroundColor: Colors.transparent, body: SingleChildScrollView(
body: SingleChildScrollView( child: Column(
child: Column( mainAxisAlignment: MainAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ Padding(
Padding( padding: const EdgeInsets.symmetric(
padding: const EdgeInsets.symmetric( horizontal: 40,
horizontal: 40, ),
), child: Column(
child: Column( mainAxisAlignment: MainAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ SizedBox(
SizedBox( height: MediaQuery.of(context).size.height / 10,
height: MediaQuery.of(context).size.height / 8, ),
), Row(
Row( children: [
children: [ Expanded(
Expanded( child: Align(
child: Align( alignment: Alignment.centerLeft,
alignment: Alignment.centerLeft, child: Image.asset(
child: Image.asset( "assets/images/login_tip.png",
"assets/images/login_tip.png", height: 45,
height: 45, ),
), ),
), ),
), GestureDetector(
GestureDetector( onDoubleTap: () {
onDoubleTap: () { if (debugBtnIsShow()) {
if (debugBtnIsShow()) { dismissDebugBtn();
dismissDebugBtn(); } else {
} else { showDebugBtn(context, btnColor: ref.watch(themeProvider).primaryColor);
showDebugBtn(context, }
btnColor: ref WidgetsBinding.instance?.endOfFrame;
.watch(themeProvider) },
.primaryColor); child: ColorFiltered(
} colorFilter: ColorFilter.mode(
WidgetsBinding.instance?.endOfFrame; ref.watch(themeProvider).primaryColor,
}, BlendMode.srcIn,
child: ColorFiltered( ),
colorFilter: ColorFilter.mode( child: Image.asset(
ref.watch(themeProvider).primaryColor, "assets/images/ql.png",
BlendMode.srcIn, height: 45,
), ),
child: Image.asset(
"assets/images/ql.png",
height: 45,
), ),
), ),
), ],
],
),
SizedBox(
height: MediaQuery.of(context).size.height / 15,
),
const Text(
"域名:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
), ),
), SizedBox(
TextField( height: MediaQuery.of(context).size.height / 15,
onChanged: (_) {
setState(() {});
},
controller: _hostController,
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "http://1.1.1.1:5700",
), ),
autofocus: false, const Text(
), "域名:",
FlipCard( style: TextStyle(
key: cardKey, fontSize: 16,
flipOnTouch: false, fontWeight: FontWeight.w600,
onFlipDone: (back) {
useSecretLogin = back;
setState(() {});
},
direction: FlipDirection.HORIZONTAL,
front: SizedBox(
height: 200,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 15,
),
const Text(
"用户名:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _userNameController,
decoration: const InputDecoration(
contentPadding:
EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入用户名",
),
autofocus: false,
),
const SizedBox(
height: 15,
),
const Text(
"密码:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _passwordController,
obscureText: true,
decoration: const InputDecoration(
contentPadding:
EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入密码",
),
autofocus: false,
),
const SizedBox(
height: 10,
),
],
), ),
), ),
back: SizedBox( TextField(
height: 200, onChanged: (_) {
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 15,
),
const Text(
"client_id:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _cIdController,
decoration: const InputDecoration(
contentPadding:
EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入client_id",
),
autofocus: false,
),
const SizedBox(
height: 15,
),
const Text(
"client_secret:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _cSecretController,
obscureText: true,
decoration: const InputDecoration(
contentPadding:
EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入client_secret",
),
autofocus: false,
),
const SizedBox(
height: 10,
),
],
),
),
),
],
),
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 25,
),
child: Row(
children: [
Checkbox(
value: rememberPassword,
onChanged: (checked) {
rememberPassword = checked ?? false;
setState(() {});
},
),
const Text(
"记住密码/client",
style: TextStyle(
fontSize: 14,
),
),
const Spacer(),
GestureDetector(
onTap: () {
cardKey.currentState?.toggleCard();
WidgetsBinding.instance
?.addPostFrameCallback((timeStamp) {
setState(() {}); setState(() {});
}); },
}, controller: _hostController,
child: Text( decoration: const InputDecoration(
loginByUserName() ? "client_id登录" : "账号登录", contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
style: const TextStyle( hintText: "http://1.1.1.1:5700",
),
autofocus: false,
),
FlipCard(
key: cardKey,
flipOnTouch: false,
onFlipDone: (back) {
useSecretLogin = back;
setState(() {});
},
direction: FlipDirection.HORIZONTAL,
front: SizedBox(
height: 200,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 15,
),
const Text(
"用户名:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _userNameController,
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入用户名",
),
autofocus: false,
),
const SizedBox(
height: 15,
),
const Text(
"密码:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _passwordController,
obscureText: true,
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入密码",
),
autofocus: false,
),
const SizedBox(
height: 10,
),
],
),
),
back: SizedBox(
height: 200,
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 15,
),
const Text(
"client_id:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _cIdController,
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入client_id",
),
autofocus: false,
),
const SizedBox(
height: 15,
),
const Text(
"client_secret:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
TextField(
onChanged: (_) {
setState(() {});
},
controller: _cSecretController,
obscureText: true,
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入client_secret",
),
autofocus: false,
),
const SizedBox(
height: 10,
),
],
),
),
),
],
),
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: 25,
),
child: Row(
children: [
Checkbox(
value: rememberPassword,
onChanged: (checked) {
rememberPassword = checked ?? false;
setState(() {});
},
),
const Text(
"记住密码/client",
style: TextStyle(
fontSize: 14, fontSize: 14,
), ),
), ),
), const Spacer(),
const SizedBox( GestureDetector(
width: 10, onTap: () {
), cardKey.currentState?.toggleCard();
], WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
), setState(() {});
), });
const SizedBox( },
height: 30, child: Text(
), loginByUserName() ? "client_id登录" : "账号登录",
Container( style: const TextStyle(
alignment: Alignment.center, fontSize: 14,
padding: const EdgeInsets.symmetric( ),
horizontal: 40, ),
),
child: SizedBox(
width: MediaQuery.of(context).size.width - 80,
child: IgnorePointer(
ignoring: !canClickLoginBtn(),
child: CupertinoButton(
padding: const EdgeInsets.symmetric(
vertical: 5,
), ),
color: canClickLoginBtn() const SizedBox(
? ref.watch(themeProvider).primaryColor width: 10,
: ref ),
.watch(themeProvider) ],
.primaryColor ),
.withOpacity(0.4), ),
child: isLoading const SizedBox(
? const CupertinoActivityIndicator() height: 30,
: const Text( ),
"登 录", Container(
style: TextStyle( alignment: Alignment.center,
fontSize: 16, padding: const EdgeInsets.symmetric(
horizontal: 40,
),
child: SizedBox(
width: MediaQuery.of(context).size.width - 80,
child: IgnorePointer(
ignoring: !canClickLoginBtn(),
child: CupertinoButton(
padding: const EdgeInsets.symmetric(
vertical: 5,
),
color: canClickLoginBtn() ? ref.watch(themeProvider).primaryColor : ref.watch(themeProvider).primaryColor.withOpacity(0.4),
child: isLoading
? const CupertinoActivityIndicator()
: const Text(
"登 录",
style: TextStyle(
fontSize: 16,
),
), ),
), onPressed: () {
onPressed: () { Http.pushedLoginPage = false;
Http.pushedLoginPage = false; Utils.hideKeyBoard(context);
Utils.hideKeyBoard(context); if (loginByUserName()) {
if (loginByUserName()) { login(_userNameController.text, _passwordController.text);
login(_userNameController.text, } else {
_passwordController.text); login(_cIdController.text, _cSecretController.text);
} else { }
login(_cIdController.text, },
_cSecretController.text); ),
} ),
}, ),
),
const SizedBox(
height: 30,
),
],
),
),
),
Positioned(
bottom: 10,
child: SizedBox(
width: MediaQuery.of(context).size.width,
child: Center(
child: Material(
color: Colors.transparent,
child: PopupMenuButton<UserInfoBean>(
onSelected: (UserInfoBean result) {
selected(result);
},
itemBuilder: (BuildContext context) => <PopupMenuEntry<UserInfoBean>>[
...getIt<UserInfoViewModel>()
.historyAccounts
.map((e) => PopupMenuItem<UserInfoBean>(
value: e,
child: buildCell(e),
))
.toList(),
],
child: Text(
"切换账号",
style: TextStyle(
color: ref.watch(themeProvider).primaryColor,
fontSize: 14,
), ),
), ),
), ),
), ),
], ),
), ),
), ),
), ],
], ),
), ),
), ),
); );
@@ -400,8 +420,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
isLoading = true; isLoading = true;
setState(() {}); setState(() {});
helper = LoginHelper(useSecretLogin, _hostController.text, userName, helper = LoginHelper(useSecretLogin, _hostController.text, userName, password, rememberPassword);
password, rememberPassword);
var response = await helper!.login(); var response = await helper!.login();
dealLoginResponse(response); dealLoginResponse(response);
} }
@@ -426,11 +445,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
if (_hostController.text.isEmpty) return false; if (_hostController.text.isEmpty) return false;
if (!loginByUserName()) { if (!loginByUserName()) {
return _cIdController.text.isNotEmpty && return _cIdController.text.isNotEmpty && _cSecretController.text.isNotEmpty;
_cSecretController.text.isNotEmpty;
} else { } else {
return _userNameController.text.isNotEmpty && return _userNameController.text.isNotEmpty && _passwordController.text.isNotEmpty;
_passwordController.text.isNotEmpty;
} }
} }
@@ -501,11 +518,49 @@ class _LoginPageState extends ConsumerState<LoginPage> {
void update() async { void update() async {
String? result = await UpdateUtils().checkUpdate(); String? result = await UpdateUtils().checkUpdate();
if (result != null && result.isNotEmpty) { if (result != null && result.isNotEmpty) {
UpdateDialog updateDialog = UpdateDialog(context, UpdateDialog updateDialog = UpdateDialog(context, title: "发现新版本", updateContent: "版本号:v${result}", onUpdate: () {
title: "发现新版本", updateContent: "版本号:v${result}", onUpdate: () {
UpdateUtils.launchURL(result); UpdateUtils.launchURL(result);
}); });
updateDialog.show(); updateDialog.show();
} }
} }
Widget buildCell(UserInfoBean bean) {
return ListTile(
title: Text(
bean.host ?? "",
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
subtitle: Padding(
padding: const EdgeInsets.only(top: 10.0),
child: Text(
bean.userName ?? "",
),
),
);
}
void selected(UserInfoBean result) {
_hostController.text = result.host ?? "";
if (result.useSecretLogined) {
_cIdController.text = result.userName ?? "";
_cSecretController.text = result.password ?? "";
if (cardKey.currentState?.isFront ?? false) {
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
cardKey.currentState?.toggleCard();
});
}
} else {
_userNameController.text = result.userName ?? "";
_passwordController.text = result.password ?? "";
if (!(cardKey.currentState?.isFront ?? false)) {
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
cardKey.currentState?.toggleCard();
});
}
}
rememberPassword = true;
setState(() {});
}
} }

View File

@@ -50,7 +50,7 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
"轻触账号以切换登录", "轻触账号以切换登录",
style: TextStyle( style: TextStyle(
color: ref.watch(themeProvider).themeColor.titleColor(), color: ref.watch(themeProvider).themeColor.titleColor(),
fontSize: 25, fontSize: 22,
), ),
), ),
const SizedBox( const SizedBox(
@@ -64,14 +64,13 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) { itemBuilder: (context, index) {
if (index == if (index == getIt<UserInfoViewModel>().historyAccounts.length) {
getIt<UserInfoViewModel>().historyAccounts.length) {
return addAccount(); return addAccount();
} }
return ClipRRect( return ClipRRect(
borderRadius: BorderRadius.circular(10), borderRadius: BorderRadius.circular(10),
child: Container( child: Container(
color: Colors.white, color: ref.watch(themeProvider).themeColor.settingBordorColor(),
child: buildCell(index), child: buildCell(index),
), ),
); );
@@ -81,8 +80,7 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
height: 10, height: 10,
); );
}, },
itemCount: itemCount: getIt<UserInfoViewModel>().historyAccounts.length + 1),
getIt<UserInfoViewModel>().historyAccounts.length + 1),
), ),
], ],
), ),
@@ -115,13 +113,11 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
border: Border.all( border: Border.all(color: ref.watch(themeProvider).primaryColor, width: 1),
color: ref.watch(themeProvider).primaryColor, width: 1),
), ),
child: Text( child: Text(
"已登录", "已登录",
style: TextStyle( style: TextStyle(color: ref.watch(themeProvider).primaryColor, fontSize: 12),
color: ref.watch(themeProvider).primaryColor, fontSize: 12),
), ),
) )
: (isLoginingHost.isNotEmpty : (isLoginingHost.isNotEmpty
@@ -136,8 +132,7 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
: const SizedBox.shrink()), : const SizedBox.shrink()),
); );
if (getIt<UserInfoViewModel>().historyAccounts[index].host == if (getIt<UserInfoViewModel>().historyAccounts[index].host == getIt<UserInfoViewModel>().host) {
getIt<UserInfoViewModel>().host) {
return child; return child;
} }
@@ -151,8 +146,7 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
backgroundColor: Colors.red, backgroundColor: Colors.red,
flex: 1, flex: 1,
onPressed: (_) { onPressed: (_) {
getIt<UserInfoViewModel>().removeHistoryAccount( getIt<UserInfoViewModel>().removeHistoryAccount(getIt<UserInfoViewModel>().historyAccounts[index].host);
getIt<UserInfoViewModel>().historyAccounts[index].host);
setState(() {}); setState(() {});
}, },
foregroundColor: Colors.white, foregroundColor: Colors.white,
@@ -187,8 +181,7 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
void dealLoginResponse(int response) { void dealLoginResponse(int response) {
if (response == LoginHelper.success) { if (response == LoginHelper.success) {
Navigator.of(context) Navigator.of(context).pushNamedAndRemoveUntil(Routes.routeHomePage, (_) => false);
.pushNamedAndRemoveUntil(Routes.routeHomePage, (_) => false);
} else if (response == LoginHelper.failed) { } else if (response == LoginHelper.failed) {
loginFailed(); loginFailed();
} else { } else {
@@ -284,7 +277,10 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
vertical: 15, vertical: 15,
horizontal: 15, horizontal: 15,
), ),
color: Colors.white, decoration: BoxDecoration(
color: ref.watch(themeProvider).themeColor.settingBordorColor(),
borderRadius: BorderRadius.circular(15),
),
child: Row( child: Row(
children: [ children: [
Container( Container(
@@ -308,7 +304,7 @@ class _ChangeAccountPageState extends ConsumerState<ChangeAccountPage> {
"添加账号", "添加账号",
style: TextStyle( style: TextStyle(
color: ref.watch(themeProvider).themeColor.titleColor(), color: ref.watch(themeProvider).themeColor.titleColor(),
fontSize: 18, fontSize: 16,
), ),
), ),
], ],

View File

@@ -27,10 +27,10 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Container( Container(
margin: const EdgeInsets.symmetric( margin: const EdgeInsets.symmetric(
horizontal: 15, horizontal: 15,
vertical: 30, vertical: 15,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ref.watch(themeProvider).themeColor.settingBgColor(), color: ref.watch(themeProvider).themeColor.settingBordorColor(),
borderRadius: const BorderRadius.all( borderRadius: const BorderRadius.all(
Radius.circular(15), Radius.circular(15),
), ),
@@ -48,8 +48,8 @@ class _OtherPageState extends ConsumerState<OtherPage> {
}, },
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 12, top: 10,
bottom: 8, bottom: 5,
left: 15, left: 15,
right: 15, right: 15,
), ),
@@ -58,10 +58,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"脚本管理", "脚本管理",
style: TextStyle( style: TextStyle(
color: ref color: ref.watch(themeProvider).themeColor.titleColor(),
.watch(themeProvider)
.themeColor
.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -86,7 +83,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
}, },
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
vertical: 8, vertical: 5,
horizontal: 15, horizontal: 15,
), ),
child: Row( child: Row(
@@ -94,10 +91,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"依赖管理", "依赖管理",
style: TextStyle( style: TextStyle(
color: ref color: ref.watch(themeProvider).themeColor.titleColor(),
.watch(themeProvider)
.themeColor
.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -122,8 +116,8 @@ class _OtherPageState extends ConsumerState<OtherPage> {
}, },
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 8, top: 5,
bottom: 15, bottom: 5,
left: 15, left: 15,
right: 15, right: 15,
), ),
@@ -132,10 +126,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"任务日志", "任务日志",
style: TextStyle( style: TextStyle(
color: ref color: ref.watch(themeProvider).themeColor.titleColor(),
.watch(themeProvider)
.themeColor
.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -148,24 +139,9 @@ class _OtherPageState extends ConsumerState<OtherPage> {
), ),
), ),
), ),
], const Divider(
), indent: 15,
), ),
Container(
margin: const EdgeInsets.symmetric(
horizontal: 15,
vertical: 15,
),
decoration: BoxDecoration(
color: ref.watch(themeProvider).themeColor.settingBgColor(),
borderRadius: const BorderRadius.all(
Radius.circular(15),
),
),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
GestureDetector( GestureDetector(
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
onTap: () { onTap: () {
@@ -178,9 +154,11 @@ class _OtherPageState extends ConsumerState<OtherPage> {
} }
}, },
child: Padding( child: Padding(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.only(
vertical: 10, top: 5,
horizontal: 15, bottom: 5,
left: 15,
right: 15,
), ),
child: Row( child: Row(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
@@ -188,10 +166,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"登录日志", "登录日志",
style: TextStyle( style: TextStyle(
color: ref color: ref.watch(themeProvider).themeColor.titleColor(),
.watch(themeProvider)
.themeColor
.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -220,8 +195,8 @@ class _OtherPageState extends ConsumerState<OtherPage> {
behavior: HitTestBehavior.opaque, behavior: HitTestBehavior.opaque,
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
top: 8, top: 5,
bottom: 15, bottom: 10,
left: 15, left: 15,
right: 15, right: 15,
), ),
@@ -232,10 +207,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"修改密码", "修改密码",
style: TextStyle( style: TextStyle(
color: ref color: ref.watch(themeProvider).themeColor.titleColor(),
.watch(themeProvider)
.themeColor
.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -257,7 +229,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
vertical: 15, vertical: 15,
), ),
decoration: BoxDecoration( decoration: BoxDecoration(
color: ref.watch(themeProvider).themeColor.settingBgColor(), color: ref.watch(themeProvider).themeColor.settingBordorColor(),
borderRadius: const BorderRadius.all( borderRadius: const BorderRadius.all(
Radius.circular(15), Radius.circular(15),
), ),
@@ -279,8 +251,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"夜间模式", "夜间模式",
style: TextStyle( style: TextStyle(
color: color: ref.watch(themeProvider).themeColor.titleColor(),
ref.watch(themeProvider).themeColor.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -294,6 +265,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
], ],
), ),
), ),
const Divider( const Divider(
indent: 15, indent: 15,
), ),
@@ -316,10 +288,42 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"主题设置", "主题设置",
style: TextStyle( style: TextStyle(
color: ref color: ref.watch(themeProvider).themeColor.titleColor(),
.watch(themeProvider) fontSize: 16,
.themeColor ),
.titleColor(), ),
const Spacer(),
const Icon(
CupertinoIcons.right_chevron,
size: 16,
),
],
),
),
),
const Divider(
indent: 15,
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () {
Navigator.of(context).pushNamed(Routes.routeChangeAccount);
},
child: Padding(
padding: const EdgeInsets.only(
left: 15,
right: 15,
top: 5,
bottom: 5,
),
child: Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(
"切换账号",
style: TextStyle(
color: ref.watch(themeProvider).themeColor.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -347,7 +351,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
left: 15, left: 15,
right: 15, right: 15,
top: 5, top: 5,
bottom: 15, bottom: 10,
), ),
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
@@ -356,10 +360,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
Text( Text(
"关于", "关于",
style: TextStyle( style: TextStyle(
color: ref color: ref.watch(themeProvider).themeColor.titleColor(),
.watch(themeProvider)
.themeColor
.titleColor(),
fontSize: 16, fontSize: 16,
), ),
), ),
@@ -378,29 +379,6 @@ class _OtherPageState extends ConsumerState<OtherPage> {
const SizedBox( const SizedBox(
height: 30, height: 30,
), ),
// Center(
// child: SizedBox(
// width: MediaQuery.of(context).size.width - 40,
// child: CupertinoButton(
// padding: const EdgeInsets.symmetric(
// vertical: 5,
// ),
// color: ref.watch(themeProvider).themeColor.buttonBgColor(),
// child: const Text(
// "切换账号",
// style: TextStyle(
// fontSize: 16,
// ),
// ),
// onPressed: () {
// Navigator.of(context).pushNamed(Routes.routeChangeAccount);
// },
// ),
// ),
// ),
// const SizedBox(
// height: 30,
// ),
Center( Center(
child: SizedBox( child: SizedBox(
width: MediaQuery.of(context).size.width - 40, width: MediaQuery.of(context).size.width - 40,
@@ -441,8 +419,7 @@ class _OtherPageState extends ConsumerState<OtherPage> {
), ),
onPressed: () { onPressed: () {
getIt<UserInfoViewModel>().updateToken(""); getIt<UserInfoViewModel>().updateToken("");
Navigator.of(context) Navigator.of(context).pushReplacementNamed(Routes.routeLogin);
.pushReplacementNamed(Routes.routeLogin);
}, },
), ),
], ],