增加client_id登录方式

This commit is contained in:
NewTab
2022-01-19 19:39:25 +08:00
parent 6dbed6cf49
commit e8694643d8
14 changed files with 415 additions and 281 deletions

View File

@@ -6,6 +6,8 @@
* 部分页面进入卡顿优化 * 部分页面进入卡顿优化
* 扩大任务的搜索范围 * 扩大任务的搜索范围
* 优化暗黑主题 * 优化暗黑主题
* 支持client_id登录
* 修改bug
## 1.0.0 ## 1.0.0

41
ios/Podfile.lock Normal file
View File

@@ -0,0 +1,41 @@
PODS:
- Flutter (1.0.0)
- fluttertoast (0.0.2):
- Flutter
- Toast
- move_to_background (0.0.1):
- Flutter
- shared_preferences_ios (0.0.1):
- Flutter
- Toast (4.0.0)
DEPENDENCIES:
- Flutter (from `Flutter`)
- fluttertoast (from `.symlinks/plugins/fluttertoast/ios`)
- move_to_background (from `.symlinks/plugins/move_to_background/ios`)
- shared_preferences_ios (from `.symlinks/plugins/shared_preferences_ios/ios`)
SPEC REPOS:
trunk:
- Toast
EXTERNAL SOURCES:
Flutter:
:path: Flutter
fluttertoast:
:path: ".symlinks/plugins/fluttertoast/ios"
move_to_background:
:path: ".symlinks/plugins/move_to_background/ios"
shared_preferences_ios:
:path: ".symlinks/plugins/shared_preferences_ios/ios"
SPEC CHECKSUMS:
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
fluttertoast: 6122fa75143e992b1d3470f61000f591a798cc58
move_to_background: 39a5b79b26d577b0372cbe8a8c55e7aa9fcd3a2d
shared_preferences_ios: aef470a42dc4675a1cdd50e3158b42e3d1232b32
Toast: 91b396c56ee72a5790816f40d3a94dd357abc196
PODFILE CHECKSUM: aea2ed8a4b05dec076f6f7cea39202b1133ed51c
COCOAPODS: 1.11.2

View File

@@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1320"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -29,7 +29,7 @@ class Api {
String id, String id,
String secret, String secret,
) async { ) async {
return await Http.post<LoginBean>( return await Http.get<LoginBean>(
Url.loginByClientId, Url.loginByClientId,
{ {
"client_id": id, "client_id": id,

View File

@@ -1,4 +1,5 @@
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:qinglong_app/base/http/url.dart';
import 'package:qinglong_app/main.dart'; import 'package:qinglong_app/main.dart';
import '../userinfo_viewmodel.dart'; import '../userinfo_viewmodel.dart';
@@ -15,8 +16,10 @@ class TokenInterceptor extends Interceptor {
options.headers["User-Agent"] = options.headers["User-Agent"] =
"Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"; "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";
options.headers["Content-Type"] = "application/json;charset=UTF-8"; options.headers["Content-Type"] = "application/json;charset=UTF-8";
options.queryParameters["t"] = if (options.path != Url.loginByClientId) {
(DateTime.now().millisecondsSinceEpoch ~/ 1000).toString(); options.queryParameters["t"] =
(DateTime.now().millisecondsSinceEpoch ~/ 1000).toString();
}
return handler.next(options); return handler.next(options);
} }
} }

View File

@@ -6,7 +6,7 @@ class Url {
static const loginByClientId = "/open/auth/token"; static const loginByClientId = "/open/auth/token";
static const user = "/api/user"; static const user = "/api/user";
static get tasks => getIt<UserInfoViewModel>().useSecretLogined ? "/open/user/login" : "/api/crons"; static get tasks => getIt<UserInfoViewModel>().useSecretLogined ? "/open/crons" : "/api/crons";
static get runTasks => getIt<UserInfoViewModel>().useSecretLogined ? "/open/crons/run" : "/api/crons/run"; static get runTasks => getIt<UserInfoViewModel>().useSecretLogined ? "/open/crons/run" : "/api/crons/run";

View File

@@ -49,12 +49,12 @@ class Routes {
return CupertinoPageRoute(builder: (context) => const AddTaskPage()); return CupertinoPageRoute(builder: (context) => const AddTaskPage());
} }
case routeAddDependency: case routeAddDependency:
return CupertinoPageRoute(builder: (context) => const AddDependenyPage()); return CupertinoPageRoute(builder: (context) => const AddDependencyPage());
case routeAddEnv: case routeAddEnv:
if (settings.arguments != null) { if (settings.arguments != null) {
return CupertinoPageRoute( return CupertinoPageRoute(
builder: (context) => AddEnvPage( builder: (context) => AddEnvPage(
taskBean: settings.arguments as EnvBean, envBean: settings.arguments as EnvBean,
)); ));
} else { } else {
return CupertinoPageRoute(builder: (context) => const AddEnvPage()); return CupertinoPageRoute(builder: (context) => const AddEnvPage());

View File

@@ -13,8 +13,10 @@ class UserInfoViewModel {
String userInfoJson = SpUtil.getString(spUserInfo); String userInfoJson = SpUtil.getString(spUserInfo);
_userName = SpUtil.getString(spUserName); _userName = SpUtil.getString(spUserName);
_passWord = SpUtil.getString(spPassWord); _passWord = SpUtil.getString(spPassWord);
_useSecertLogined = SpUtil.getBool(spSecretLogined, defValue: false); _useSecertLogined = SpUtil.getBool(spSecretLogined, defValue: false);
_host = SpUtil.getString(spHost, defValue: 'http://49.234.59.95:5700'); _host = SpUtil.getString(spHost, defValue: 'http://1.1.1.1:5700');
if (userInfoJson.isNotEmpty) { if (userInfoJson.isNotEmpty) {
_token = userInfoJson; _token = userInfoJson;
} }

View File

@@ -18,8 +18,6 @@ class ConfigEditPage extends ConsumerStatefulWidget {
} }
class _ConfigEditPageState extends ConsumerState<ConfigEditPage> { class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
String? value;
late TextEditingController _controller; late TextEditingController _controller;
FocusNode node = FocusNode(); FocusNode node = FocusNode();
@@ -46,12 +44,10 @@ class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
actions: [ actions: [
InkWell( InkWell(
onTap: () async { onTap: () async {
if (value == null) { HttpResponse<NullResponse> response =
"请先点击保存".toast(); await Api.saveFile(widget.title, _controller.text);
return;
}
HttpResponse<NullResponse> response = await Api.saveFile(widget.title, _controller.text);
if (response.success) { if (response.success) {
"提交成功".toast();
ref.read(configProvider).loadContent(widget.title); ref.read(configProvider).loadContent(widget.title);
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {

View File

@@ -8,9 +8,9 @@ import 'package:qinglong_app/module/env/env_viewmodel.dart';
import 'package:qinglong_app/utils/extension.dart'; import 'package:qinglong_app/utils/extension.dart';
class AddEnvPage extends ConsumerStatefulWidget { class AddEnvPage extends ConsumerStatefulWidget {
final EnvBean? taskBean; final EnvBean? envBean;
const AddEnvPage({Key? key, this.taskBean}) : super(key: key); const AddEnvPage({Key? key, this.envBean}) : super(key: key);
@override @override
ConsumerState<AddEnvPage> createState() => _AddEnvPageState(); ConsumerState<AddEnvPage> createState() => _AddEnvPageState();
@@ -27,8 +27,8 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
if (widget.taskBean != null) { if (widget.envBean != null) {
envBean = widget.taskBean!; envBean = widget.envBean!;
_nameController.text = envBean.name ?? ""; _nameController.text = envBean.name ?? "";
_valueController.text = envBean.value ?? ""; _valueController.text = envBean.value ?? "";
_remarkController.text = envBean.remarks ?? ""; _remarkController.text = envBean.remarks ?? "";
@@ -88,7 +88,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox( const SizedBox(
height: 10, height: 15,
), ),
const Text( const Text(
"名称:", "名称:",
@@ -97,14 +97,10 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
const SizedBox(
height: 10,
),
TextField( TextField(
focusNode: focusNode, focusNode: focusNode,
controller: _nameController, controller: _nameController,
decoration: const InputDecoration( decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入名称", hintText: "请输入名称",
), ),
autofocus: false, autofocus: false,
@@ -121,7 +117,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox( const SizedBox(
height: 10, height: 15,
), ),
const Text( const Text(
"值:", "值:",
@@ -130,15 +126,11 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
const SizedBox(
height: 10,
),
TextField( TextField(
controller: _valueController, controller: _valueController,
maxLines: 8, maxLines: 8,
minLines: 1, minLines: 1,
decoration: const InputDecoration( decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入值", hintText: "请输入值",
), ),
autofocus: false, autofocus: false,
@@ -155,7 +147,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox( const SizedBox(
height: 10, height: 15,
), ),
const Text( const Text(
"备注:", "备注:",
@@ -164,13 +156,9 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
const SizedBox(
height: 10,
),
TextField( TextField(
controller: _remarkController, controller: _remarkController,
decoration: const InputDecoration( decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入备注", hintText: "请输入备注",
), ),
autofocus: false, autofocus: false,
@@ -197,10 +185,12 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
envBean.name = _nameController.text; envBean.name = _nameController.text;
envBean.value = _valueController.text; envBean.value = _valueController.text;
envBean.remarks = _remarkController.text; envBean.remarks = _remarkController.text;
HttpResponse<NullResponse> response = await Api.addEnv(_nameController.text, _valueController.text, _remarkController.text, id: envBean.sId); HttpResponse<NullResponse> response = await Api.addEnv(
_nameController.text, _valueController.text, _remarkController.text,
id: envBean.sId);
if (response.success) { if (response.success) {
"操作成功".toast(); (envBean.sId == null) ? "新增成功" : "修改成功".toast();
ref.read(envProvider).updateEnv(envBean); ref.read(envProvider).updateEnv(envBean);
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {

View File

@@ -22,7 +22,8 @@ class LoginPage extends ConsumerStatefulWidget {
} }
class _LoginPageState extends ConsumerState<LoginPage> { class _LoginPageState extends ConsumerState<LoginPage> {
final TextEditingController _hostController = TextEditingController(text: getIt<UserInfoViewModel>().host); final TextEditingController _hostController =
TextEditingController(text: getIt<UserInfoViewModel>().host);
final TextEditingController _userNameController = TextEditingController(); final TextEditingController _userNameController = TextEditingController();
final TextEditingController _passwordController = TextEditingController(); final TextEditingController _passwordController = TextEditingController();
final TextEditingController _cIdController = TextEditingController(); final TextEditingController _cIdController = TextEditingController();
@@ -31,11 +32,15 @@ class _LoginPageState extends ConsumerState<LoginPage> {
bool rememberPassword = false; bool rememberPassword = false;
bool useSecretLogin = false;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
useSecretLogin = getIt<UserInfoViewModel>().useSecretLogined;
if (getIt<UserInfoViewModel>().userName != null && getIt<UserInfoViewModel>().userName!.isNotEmpty) { if (getIt<UserInfoViewModel>().userName != null &&
getIt<UserInfoViewModel>().userName!.isNotEmpty) {
if (getIt<UserInfoViewModel>().useSecretLogined) { if (getIt<UserInfoViewModel>().useSecretLogined) {
_cIdController.text = getIt<UserInfoViewModel>().userName!; _cIdController.text = getIt<UserInfoViewModel>().userName!;
} else { } else {
@@ -45,7 +50,8 @@ class _LoginPageState extends ConsumerState<LoginPage> {
} else { } else {
rememberPassword = false; rememberPassword = false;
} }
if (getIt<UserInfoViewModel>().passWord != null && getIt<UserInfoViewModel>().passWord!.isNotEmpty) { if (getIt<UserInfoViewModel>().passWord != null &&
getIt<UserInfoViewModel>().passWord!.isNotEmpty) {
if (getIt<UserInfoViewModel>().useSecretLogined) { if (getIt<UserInfoViewModel>().useSecretLogined) {
_cSecretController.text = getIt<UserInfoViewModel>().passWord!; _cSecretController.text = getIt<UserInfoViewModel>().passWord!;
} else { } else {
@@ -54,12 +60,8 @@ class _LoginPageState extends ConsumerState<LoginPage> {
} }
getIt<UserInfoViewModel>().updateToken(""); getIt<UserInfoViewModel>().updateToken("");
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
if (getIt<UserInfoViewModel>().useSecretLogined) { if (useSecretLogin) {
cardKey.currentState?.toggleCard(); cardKey.currentState?.toggleCard();
getIt<UserInfoViewModel>().useSecretLogin(!(cardKey.currentState?.isFront ?? true));
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
setState(() {});
});
} }
}); });
} }
@@ -151,114 +153,126 @@ class _LoginPageState extends ConsumerState<LoginPage> {
), ),
FlipCard( FlipCard(
key: cardKey, key: cardKey,
fill: Fill.fillBack, onFlipDone: (back) {
// Fill the back side of the card to make in the same size as the front. useSecretLogin = back;
setState(() {});
},
direction: FlipDirection.HORIZONTAL, direction: FlipDirection.HORIZONTAL,
front: Column( front: SizedBox(
mainAxisSize: MainAxisSize.min, height: 200,
mainAxisAlignment: MainAxisAlignment.start, child: Column(
crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min,
children: [ mainAxisAlignment: MainAxisAlignment.start,
const SizedBox( crossAxisAlignment: CrossAxisAlignment.start,
height: 15, children: [
), const SizedBox(
const Text( height: 15,
"用户名:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
), ),
), const Text(
TextField( "用户名:",
onChanged: (_) { style: TextStyle(
setState(() {}); fontSize: 16,
}, fontWeight: FontWeight.w600,
controller: _userNameController, ),
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入用户名",
), ),
autofocus: false, TextField(
), onChanged: (_) {
const SizedBox( setState(() {});
height: 15, },
), controller: _userNameController,
const Text( decoration: const InputDecoration(
"密码:", contentPadding:
style: TextStyle( EdgeInsets.fromLTRB(0, 5, 0, 5),
fontSize: 16, hintText: "请输入用户名",
fontWeight: FontWeight.w600, ),
autofocus: false,
), ),
), const SizedBox(
TextField( height: 15,
onChanged: (_) {
setState(() {});
},
controller: _passwordController,
obscureText: true,
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入密码",
), ),
autofocus: false, const Text(
), "密码:",
const SizedBox( style: TextStyle(
height: 10, 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: Column( back: SizedBox(
mainAxisSize: MainAxisSize.min, height: 200,
mainAxisAlignment: MainAxisAlignment.start, child: Column(
crossAxisAlignment: CrossAxisAlignment.start, mainAxisSize: MainAxisSize.min,
children: [ mainAxisAlignment: MainAxisAlignment.start,
const SizedBox( crossAxisAlignment: CrossAxisAlignment.start,
height: 15, children: [
), const SizedBox(
const Text( height: 15,
"client_id:",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600,
), ),
), const Text(
TextField( "client_id:",
onChanged: (_) { style: TextStyle(
setState(() {}); fontSize: 16,
}, fontWeight: FontWeight.w600,
controller: _cIdController, ),
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入client_id",
), ),
autofocus: false, TextField(
), onChanged: (_) {
const SizedBox( setState(() {});
height: 15, },
), controller: _cIdController,
const Text( decoration: const InputDecoration(
"client_secret:", contentPadding:
style: TextStyle( EdgeInsets.fromLTRB(0, 5, 0, 5),
fontSize: 16, hintText: "请输入client_id",
fontWeight: FontWeight.w600, ),
autofocus: false,
), ),
), const SizedBox(
TextField( height: 15,
onChanged: (_) {
setState(() {});
},
controller: _cSecretController,
obscureText: true,
decoration: const InputDecoration(
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
hintText: "请输入client_secret",
), ),
autofocus: false, const Text(
), "client_secret:",
const SizedBox( style: TextStyle(
height: 10, 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,
),
],
),
), ),
), ),
Row( Row(
@@ -280,12 +294,13 @@ class _LoginPageState extends ConsumerState<LoginPage> {
GestureDetector( GestureDetector(
onTap: () { onTap: () {
cardKey.currentState?.toggleCard(); cardKey.currentState?.toggleCard();
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) { WidgetsBinding.instance
?.addPostFrameCallback((timeStamp) {
setState(() {}); setState(() {});
}); });
}, },
child: Text( child: Text(
(cardKey.currentState?.isFront ?? true) ? "client_id登录" : "用户名密码登录", loginByUserName() ? "client_id登录" : "用户名密码登录",
style: const TextStyle( style: const TextStyle(
fontSize: 14, fontSize: 14,
), ),
@@ -299,12 +314,19 @@ class _LoginPageState extends ConsumerState<LoginPage> {
SizedBox( SizedBox(
width: MediaQuery.of(context).size.width - 80, width: MediaQuery.of(context).size.width - 80,
child: IgnorePointer( child: IgnorePointer(
ignoring: _hostController.text.isEmpty || _userNameController.text.isEmpty || _passwordController.text.isEmpty || isLoading, ignoring: !canClickLoginBtn(),
child: CupertinoButton( child: CupertinoButton(
padding: const EdgeInsets.symmetric( padding: const EdgeInsets.symmetric(
vertical: 5, vertical: 5,
), ),
color: canClickLoginBtn() ? ref.watch(themeProvider).themeColor.buttonBgColor() : Theme.of(context).primaryColor.withOpacity(0.4), color: canClickLoginBtn()
? ref
.watch(themeProvider)
.themeColor
.buttonBgColor()
: Theme.of(context)
.primaryColor
.withOpacity(0.4),
child: isLoading child: isLoading
? const CupertinoActivityIndicator() ? const CupertinoActivityIndicator()
: const Text( : const Text(
@@ -316,11 +338,14 @@ class _LoginPageState extends ConsumerState<LoginPage> {
onPressed: () { onPressed: () {
Http.pushedLoginPage = false; Http.pushedLoginPage = false;
Utils.hideKeyBoard(context); Utils.hideKeyBoard(context);
getIt<UserInfoViewModel>().updateHost(_hostController.text); getIt<UserInfoViewModel>()
if (cardKey.currentState?.isFront ?? true) { .updateHost(_hostController.text);
login(_userNameController.text, _passwordController.text); if (loginByUserName()) {
login(_userNameController.text,
_passwordController.text);
} else { } else {
login(_cIdController.text, _cSecretController.text); login(_cIdController.text,
_cSecretController.text);
} }
}, },
), ),
@@ -340,7 +365,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
bool isLoading = false; bool isLoading = false;
bool loginByUserName() { bool loginByUserName() {
return !getIt<UserInfoViewModel>().useSecretLogined; return !useSecretLogin;
} }
Future<void> login(String userName, String password) async { Future<void> login(String userName, String password) async {
@@ -365,7 +390,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
} else { } else {
HttpResponse<UserBean> userResponse = await Api.user(); HttpResponse<UserBean> userResponse = await Api.user();
if (userResponse.success) { if (userResponse.success) {
if (userResponse.bean != null && userResponse.bean!.twoFactorActivated != null && userResponse.bean!.twoFactorActivated!) { if (userResponse.bean != null &&
userResponse.bean!.twoFactorActivated != null &&
userResponse.bean!.twoFactorActivated!) {
("你已开启两步验证,App暂不支持").toast(); ("你已开启两步验证,App暂不支持").toast();
isLoading = false; isLoading = false;
setState(() {}); setState(() {});
@@ -390,9 +417,11 @@ 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 && _cSecretController.text.isNotEmpty; return _cIdController.text.isNotEmpty &&
_cSecretController.text.isNotEmpty;
} else { } else {
return _userNameController.text.isNotEmpty && _passwordController.text.isNotEmpty; return _userNameController.text.isNotEmpty &&
_passwordController.text.isNotEmpty;
} }
} }
} }

View File

@@ -6,16 +6,16 @@ import 'package:qinglong_app/base/ql_app_bar.dart';
import 'package:qinglong_app/module/others/dependencies/dependency_viewmodel.dart'; import 'package:qinglong_app/module/others/dependencies/dependency_viewmodel.dart';
import 'package:qinglong_app/utils/extension.dart'; import 'package:qinglong_app/utils/extension.dart';
class AddDependenyPage extends ConsumerStatefulWidget { class AddDependencyPage extends ConsumerStatefulWidget {
const AddDependenyPage({ const AddDependencyPage({
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
@override @override
ConsumerState<AddDependenyPage> createState() => _AddDependencyPageState(); ConsumerState<AddDependencyPage> createState() => _AddDependencyPageState();
} }
class _AddDependencyPageState extends ConsumerState<AddDependenyPage> { class _AddDependencyPageState extends ConsumerState<AddDependencyPage> {
final TextEditingController _nameController = TextEditingController(); final TextEditingController _nameController = TextEditingController();
DepedencyEnum depedencyType = DepedencyEnum.NodeJS; DepedencyEnum depedencyType = DepedencyEnum.NodeJS;
@@ -83,7 +83,7 @@ class _AddDependencyPageState extends ConsumerState<AddDependenyPage> {
height: 10, height: 10,
), ),
DropdownButtonFormField<DepedencyEnum>( DropdownButtonFormField<DepedencyEnum>(
items: [ items: [
DropdownMenuItem( DropdownMenuItem(
value: DepedencyEnum.NodeJS, value: DepedencyEnum.NodeJS,
child: Text(DepedencyEnum.NodeJS.name), child: Text(DepedencyEnum.NodeJS.name),
@@ -154,7 +154,7 @@ class _AddDependencyPageState extends ConsumerState<AddDependenyPage> {
); );
if (response.success) { if (response.success) {
"操作成功".toast(); "新增成功".toast();
ref.read(dependencyProvider).loadData( ref.read(dependencyProvider).loadData(
depedencyType.name.toLowerCase(), depedencyType.name.toLowerCase(),
); );

View File

@@ -88,7 +88,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox( const SizedBox(
height: 10, height: 15,
), ),
const Text( const Text(
"名称:", "名称:",
@@ -97,9 +97,6 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
const SizedBox(
height: 10,
),
TextField( TextField(
focusNode: focusNode, focusNode: focusNode,
controller: _nameController, controller: _nameController,
@@ -121,7 +118,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox( const SizedBox(
height: 10, height: 15,
), ),
const Text( const Text(
"命令:", "命令:",
@@ -130,9 +127,6 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
const SizedBox(
height: 10,
),
TextField( TextField(
controller: _commandController, controller: _commandController,
maxLines: 4, maxLines: 4,
@@ -155,7 +149,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
const SizedBox( const SizedBox(
height: 10, height: 15,
), ),
const Text( const Text(
"定时:", "定时:",
@@ -164,9 +158,6 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
const SizedBox(
height: 10,
),
TextField( TextField(
controller: _cronController, controller: _cronController,
decoration: const InputDecoration( decoration: const InputDecoration(
@@ -213,10 +204,12 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
taskBean.name = _nameController.text; taskBean.name = _nameController.text;
taskBean.command = _commandController.text; taskBean.command = _commandController.text;
taskBean.schedule = _cronController.text; taskBean.schedule = _cronController.text;
HttpResponse<NullResponse> response = await Api.addTask(_nameController.text, _commandController.text, _cronController.text, id: taskBean.sId); HttpResponse<NullResponse> response = await Api.addTask(
_nameController.text, _commandController.text, _cronController.text,
id: taskBean.sId);
if (response.success) { if (response.success) {
"操作成功".toast(); (widget.taskBean?.sId == null) ? "新增成功" : "修改成功".toast();
ref.read(taskProvider).updateBean(taskBean); ref.read(taskProvider).updateBean(taskBean);
Navigator.of(context).pop(); Navigator.of(context).pop();
} else { } else {

View File

@@ -5,245 +5,245 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: _fe_analyzer_shared name: _fe_analyzer_shared
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "22.0.0" version: "22.0.0"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
name: analyzer name: analyzer
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.7.2" version: "1.7.2"
archive: archive:
dependency: transitive dependency: transitive
description: description:
name: archive name: archive
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.8" version: "3.1.8"
args: args:
dependency: transitive dependency: transitive
description: description:
name: args name: args
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.0" version: "2.3.0"
async: async:
dependency: transitive dependency: transitive
description: description:
name: async name: async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.2" version: "2.8.2"
back_button_interceptor: back_button_interceptor:
dependency: "direct main" dependency: "direct main"
description: description:
name: back_button_interceptor name: back_button_interceptor
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.0.2" version: "5.0.2"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
build: build:
dependency: transitive dependency: transitive
description: description:
name: build name: build
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.1" version: "2.2.1"
build_config: build_config:
dependency: transitive dependency: transitive
description: description:
name: build_config name: build_config
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
build_daemon: build_daemon:
dependency: transitive dependency: transitive
description: description:
name: build_daemon name: build_daemon
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.0.1"
build_resolvers: build_resolvers:
dependency: transitive dependency: transitive
description: description:
name: build_resolvers name: build_resolvers
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
build_runner: build_runner:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: build_runner name: build_runner
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.7" version: "2.1.7"
build_runner_core: build_runner_core:
dependency: transitive dependency: transitive
description: description:
name: build_runner_core name: build_runner_core
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.2.3" version: "7.2.3"
built_collection: built_collection:
dependency: transitive dependency: transitive
description: description:
name: built_collection name: built_collection
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.1" version: "5.1.1"
built_value: built_value:
dependency: transitive dependency: transitive
description: description:
name: built_value name: built_value
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.1.4" version: "8.1.4"
change_app_package_name: change_app_package_name:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: change_app_package_name name: change_app_package_name
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.3" version: "0.1.3"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
name: charcode name: charcode
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
checked_yaml: checked_yaml:
dependency: transitive dependency: transitive
description: description:
name: checked_yaml name: checked_yaml
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
cli_util: cli_util:
dependency: transitive dependency: transitive
description: description:
name: cli_util name: cli_util
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.5" version: "0.3.5"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
code_builder: code_builder:
dependency: transitive dependency: transitive
description: description:
name: code_builder name: code_builder
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.1.0" version: "4.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
convert: convert:
dependency: transitive dependency: transitive
description: description:
name: convert name: convert
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.0.1"
crypto: crypto:
dependency: transitive dependency: transitive
description: description:
name: crypto name: crypto
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.0.1"
cupertino_icons: cupertino_icons:
dependency: "direct main" dependency: "direct main"
description: description:
name: cupertino_icons name: cupertino_icons
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
dart_style: dart_style:
dependency: transitive dependency: transitive
description: description:
name: dart_style name: dart_style
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio name: dio
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.4" version: "4.0.4"
dio_log: dio_log:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio_log name: dio_log
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
drag_and_drop_lists: drag_and_drop_lists:
dependency: "direct main" dependency: "direct main"
description: description:
name: drag_and_drop_lists name: drag_and_drop_lists
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.2+2" version: "0.3.2+2"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
ffi: ffi:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
file: file:
dependency: transitive dependency: transitive
description: description:
name: file name: file
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.2" version: "6.1.2"
fixnum: fixnum:
dependency: transitive dependency: transitive
description: description:
name: fixnum name: fixnum
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
flip_card: flip_card:
dependency: "direct main" dependency: "direct main"
description: description:
name: flip_card name: flip_card
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.0" version: "0.6.0"
flutter: flutter:
@@ -255,49 +255,49 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_app_name name: flutter_app_name
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.1.1" version: "0.1.1"
flutter_highlight: flutter_highlight:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_highlight name: flutter_highlight
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.0" version: "0.7.0"
flutter_launcher_icons: flutter_launcher_icons:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_launcher_icons name: flutter_launcher_icons
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.9.2" version: "0.9.2"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
flutter_native_splash: flutter_native_splash:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_native_splash name: flutter_native_splash
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.3" version: "1.3.3"
flutter_riverpod: flutter_riverpod:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_riverpod name: flutter_riverpod
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
flutter_slidable: flutter_slidable:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_slidable name: flutter_slidable
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
flutter_test: flutter_test:
@@ -314,322 +314,322 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: fluttertoast name: fluttertoast
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "8.0.8" version: "8.0.8"
frontend_server_client: frontend_server_client:
dependency: transitive dependency: transitive
description: description:
name: frontend_server_client name: frontend_server_client
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
get_it: get_it:
dependency: "direct main" dependency: "direct main"
description: description:
name: get_it name: get_it
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.2.0" version: "7.2.0"
glob: glob:
dependency: transitive dependency: transitive
description: description:
name: glob name: glob
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
graphs: graphs:
dependency: transitive dependency: transitive
description: description:
name: graphs name: graphs
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
highlight: highlight:
dependency: transitive dependency: transitive
description: description:
name: highlight name: highlight
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.0" version: "0.7.0"
http_multi_server: http_multi_server:
dependency: transitive dependency: transitive
description: description:
name: http_multi_server name: http_multi_server
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.0.1"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
name: http_parser name: http_parser
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
image: image:
dependency: transitive dependency: transitive
description: description:
name: image name: image
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.1" version: "3.1.1"
intl: intl:
dependency: "direct main" dependency: "direct main"
description: description:
name: intl name: intl
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.17.0" version: "0.17.0"
io: io:
dependency: transitive dependency: transitive
description: description:
name: io name: io
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
js: js:
dependency: transitive dependency: transitive
description: description:
name: js name: js
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.3" version: "0.6.3"
json_annotation: json_annotation:
dependency: transitive dependency: transitive
description: description:
name: json_annotation name: json_annotation
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.4.0" version: "4.4.0"
json_conversion: json_conversion:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: json_conversion name: json_conversion
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.4" version: "0.0.4"
json_conversion_annotation: json_conversion_annotation:
dependency: "direct main" dependency: "direct main"
description: description:
name: json_conversion_annotation name: json_conversion_annotation
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.4" version: "0.0.4"
lints: lints:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
logger: logger:
dependency: "direct main" dependency: "direct main"
description: description:
name: logger name: logger
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
logging: logging:
dependency: transitive dependency: transitive
description: description:
name: logging name: logging
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.11" version: "0.12.11"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.7.0" version: "1.7.0"
mime: mime:
dependency: transitive dependency: transitive
description: description:
name: mime name: mime
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
move_to_background: move_to_background:
dependency: "direct main" dependency: "direct main"
description: description:
name: move_to_background name: move_to_background
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
package_config: package_config:
dependency: transitive dependency: transitive
description: description:
name: package_config name: package_config
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.0"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.5" version: "2.1.5"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.5" version: "2.0.5"
pedantic: pedantic:
dependency: transitive dependency: transitive
description: description:
name: pedantic name: pedantic
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.11.1" version: "1.11.1"
petitparser: petitparser:
dependency: transitive dependency: transitive
description: description:
name: petitparser name: petitparser
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.4.0" version: "4.4.0"
platform: platform:
dependency: transitive dependency: transitive
description: description:
name: platform name: platform
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.2" version: "2.1.2"
pool: pool:
dependency: transitive dependency: transitive
description: description:
name: pool name: pool
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.5.0" version: "1.5.0"
process: process:
dependency: transitive dependency: transitive
description: description:
name: process name: process
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.4" version: "4.2.4"
pub_semver: pub_semver:
dependency: transitive dependency: transitive
description: description:
name: pub_semver name: pub_semver
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
pubspec_parse: pubspec_parse:
dependency: transitive dependency: transitive
description: description:
name: pubspec_parse name: pubspec_parse
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
riverpod: riverpod:
dependency: transitive dependency: transitive
description: description:
name: riverpod name: riverpod
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
name: shared_preferences name: shared_preferences
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.12" version: "2.0.12"
shared_preferences_android: shared_preferences_android:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_android name: shared_preferences_android
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.10" version: "2.0.10"
shared_preferences_ios: shared_preferences_ios:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_ios name: shared_preferences_ios
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.9" version: "2.0.9"
shared_preferences_linux: shared_preferences_linux:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_linux name: shared_preferences_linux
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
shared_preferences_macos: shared_preferences_macos:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_macos name: shared_preferences_macos
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
shared_preferences_platform_interface: shared_preferences_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_platform_interface name: shared_preferences_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
shared_preferences_web: shared_preferences_web:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_web name: shared_preferences_web
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
shared_preferences_windows: shared_preferences_windows:
dependency: transitive dependency: transitive
description: description:
name: shared_preferences_windows name: shared_preferences_windows
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
shelf: shelf:
dependency: transitive dependency: transitive
description: description:
name: shelf name: shelf
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
shelf_web_socket: shelf_web_socket:
dependency: transitive dependency: transitive
description: description:
name: shelf_web_socket name: shelf_web_socket
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
sky_engine: sky_engine:
@@ -641,140 +641,140 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_gen name: source_gen
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
source_span: source_span:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.8.1"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0" version: "1.10.0"
state_notifier: state_notifier:
dependency: transitive dependency: transitive
description: description:
name: state_notifier name: state_notifier
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.2+1" version: "0.7.2+1"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
stream_transform: stream_transform:
dependency: transitive dependency: transitive
description: description:
name: stream_transform name: stream_transform
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.0" version: "2.0.0"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
synchronized: synchronized:
dependency: "direct main" dependency: "direct main"
description: description:
name: synchronized name: synchronized
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.0" version: "3.0.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.3" version: "0.4.3"
timing: timing:
dependency: transitive dependency: transitive
description: description:
name: timing name: timing
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
universal_io: universal_io:
dependency: transitive dependency: transitive
description: description:
name: universal_io name: universal_io
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.1" version: "2.1.1"
watcher: watcher:
dependency: transitive dependency: transitive
description: description:
name: watcher name: watcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
web_socket_channel: web_socket_channel:
dependency: transitive dependency: transitive
description: description:
name: web_socket_channel name: web_socket_channel
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
win32: win32:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.3.6" version: "2.3.6"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
name: xdg_directories name: xdg_directories
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.0" version: "0.2.0"
xml: xml:
dependency: transitive dependency: transitive
description: description:
name: xml name: xml
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.3.1" version: "5.3.1"
yaml: yaml:
dependency: transitive dependency: transitive
description: description:
name: yaml name: yaml
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
sdks: sdks: