mirror of
https://github.com/qinglong-app/qinglong_app.git
synced 2025-10-09 16:48:19 +08:00
增加剪切板控制
This commit is contained in:
@ -4,3 +4,4 @@ String spUserName = "username";
|
||||
String spPassWord = "password";
|
||||
String spTheme = "dart_mode";
|
||||
String spSecretLogined = "secret_logined";
|
||||
String spForbidClipBoard = "forbid_read_clipboard";
|
||||
|
||||
@ -8,11 +8,16 @@ class UserInfoViewModel {
|
||||
String? _userName;
|
||||
String? _passWord;
|
||||
bool _useSecertLogined = false;
|
||||
bool _forbidReadClipBoard = false;
|
||||
|
||||
UserInfoViewModel() {
|
||||
String userInfoJson = SpUtil.getString(spUserInfo);
|
||||
_userName = SpUtil.getString(spUserName);
|
||||
_passWord = SpUtil.getString(spPassWord);
|
||||
_forbidReadClipBoard = SpUtil.getBool(
|
||||
spForbidClipBoard,
|
||||
defValue: false,
|
||||
);
|
||||
|
||||
_useSecertLogined = SpUtil.getBool(spSecretLogined, defValue: false);
|
||||
_host = SpUtil.getString(spHost, defValue: '');
|
||||
@ -34,6 +39,11 @@ class UserInfoViewModel {
|
||||
SpUtil.putString(spPassWord, password);
|
||||
}
|
||||
|
||||
void forbidReadClipBoard(bool forbid) {
|
||||
_forbidReadClipBoard = forbid;
|
||||
SpUtil.putBool(spForbidClipBoard, forbid);
|
||||
}
|
||||
|
||||
void useSecretLogin(bool use) {
|
||||
_useSecertLogined = use;
|
||||
SpUtil.putBool(spSecretLogined, _useSecertLogined);
|
||||
@ -54,6 +64,8 @@ class UserInfoViewModel {
|
||||
|
||||
bool get useSecretLogined => _useSecertLogined;
|
||||
|
||||
bool get forbidReadClipBoarded => _forbidReadClipBoard;
|
||||
|
||||
bool isLogined() {
|
||||
return token != null && token!.isNotEmpty;
|
||||
}
|
||||
|
||||
@ -4,9 +4,12 @@ import 'package:qinglong_app/base/http/api.dart';
|
||||
import 'package:qinglong_app/base/http/http.dart';
|
||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||
import 'package:qinglong_app/base/theme.dart';
|
||||
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||
import 'package:qinglong_app/module/config/config_viewmodel.dart';
|
||||
import 'package:qinglong_app/utils/extension.dart';
|
||||
|
||||
import '../../main.dart';
|
||||
|
||||
class ConfigEditPage extends ConsumerStatefulWidget {
|
||||
final String content;
|
||||
final String title;
|
||||
@ -44,8 +47,7 @@ class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
|
||||
actions: [
|
||||
InkWell(
|
||||
onTap: () async {
|
||||
HttpResponse<NullResponse> response =
|
||||
await Api.saveFile(widget.title, _controller.text);
|
||||
HttpResponse<NullResponse> response = await Api.saveFile(widget.title, _controller.text);
|
||||
if (response.success) {
|
||||
"提交成功".toast();
|
||||
ref.read(configProvider).loadContent(widget.title);
|
||||
@ -78,6 +80,7 @@ class _ConfigEditPageState extends ConsumerState<ConfigEditPage> {
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
focusNode: node,
|
||||
style: TextStyle(
|
||||
color: ref.read(themeProvider).themeColor.descColor(),
|
||||
|
||||
6
lib/module/env/add_env_page.dart
vendored
6
lib/module/env/add_env_page.dart
vendored
@ -3,10 +3,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:qinglong_app/base/http/api.dart';
|
||||
import 'package:qinglong_app/base/http/http.dart';
|
||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||
import 'package:qinglong_app/module/env/env_bean.dart';
|
||||
import 'package:qinglong_app/module/env/env_viewmodel.dart';
|
||||
import 'package:qinglong_app/utils/extension.dart';
|
||||
|
||||
import '../../main.dart';
|
||||
|
||||
class AddEnvPage extends ConsumerStatefulWidget {
|
||||
final EnvBean? envBean;
|
||||
|
||||
@ -98,6 +101,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
focusNode: focusNode,
|
||||
controller: _nameController,
|
||||
decoration: const InputDecoration(
|
||||
@ -127,6 +131,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
controller: _valueController,
|
||||
maxLines: 8,
|
||||
minLines: 1,
|
||||
@ -157,6 +162,7 @@ class _AddEnvPageState extends ConsumerState<AddEnvPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
controller: _remarkController,
|
||||
decoration: const InputDecoration(
|
||||
hintText: "请输入备注",
|
||||
|
||||
@ -142,6 +142,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
onChanged: (_) {
|
||||
setState(() {});
|
||||
},
|
||||
@ -177,6 +178,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
onChanged: (_) {
|
||||
setState(() {});
|
||||
},
|
||||
@ -198,6 +200,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
onChanged: (_) {
|
||||
setState(() {});
|
||||
},
|
||||
@ -233,6 +236,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
onChanged: (_) {
|
||||
setState(() {});
|
||||
},
|
||||
@ -254,6 +258,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
onChanged: (_) {
|
||||
setState(() {});
|
||||
},
|
||||
@ -276,7 +281,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 25,),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 25,
|
||||
),
|
||||
child: Row(
|
||||
children: [
|
||||
Checkbox(
|
||||
@ -307,7 +314,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
),
|
||||
),
|
||||
SizedBox(width: 10,),
|
||||
SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
@ -316,7 +325,9 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
),
|
||||
Container(
|
||||
alignment: Alignment.center,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 40,),
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 40,
|
||||
),
|
||||
child: SizedBox(
|
||||
width: MediaQuery.of(context).size.width - 80,
|
||||
child: IgnorePointer(
|
||||
@ -396,6 +407,7 @@ class _LoginPageState extends ConsumerState<LoginPage> {
|
||||
onChanged: (value) {
|
||||
twoFact = value;
|
||||
},
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
maxLines: 1,
|
||||
keyboardType: TextInputType.number,
|
||||
decoration: const InputDecoration(
|
||||
|
||||
@ -4,9 +4,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:qinglong_app/base/http/api.dart';
|
||||
import 'package:qinglong_app/base/http/http.dart';
|
||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||
import 'package:qinglong_app/module/others/dependencies/dependency_viewmodel.dart';
|
||||
import 'package:qinglong_app/utils/extension.dart';
|
||||
|
||||
import '../../../main.dart';
|
||||
|
||||
class AddDependencyPage extends ConsumerStatefulWidget {
|
||||
const AddDependencyPage({
|
||||
Key? key,
|
||||
@ -132,6 +135,7 @@ class _AddDependencyPageState extends ConsumerState<AddDependencyPage> {
|
||||
height: 10,
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
controller: _nameController,
|
||||
decoration: const InputDecoration(
|
||||
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
|
||||
|
||||
@ -278,6 +278,53 @@ class _OtherPageState extends ConsumerState<OtherPage> {
|
||||
const Divider(
|
||||
indent: 15,
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 15,
|
||||
right: 15,
|
||||
top: 5,
|
||||
),
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
Expanded(
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
"禁止读取剪切板",
|
||||
style: TextStyle(
|
||||
color: ref.watch(themeProvider).themeColor.titleColor(),
|
||||
fontSize: 16,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
"开启后输入框无法使用系统自带的复制粘贴功能,输入法的复制粘贴功能不受影响",
|
||||
style: TextStyle(
|
||||
color: ref.watch(themeProvider).themeColor.descColor(),
|
||||
fontSize: 12,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
CupertinoSwitch(
|
||||
value: getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
onChanged: (forbid) {
|
||||
getIt<UserInfoViewModel>().forbidReadClipBoard(forbid);
|
||||
setState(() {
|
||||
|
||||
});
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const Divider(
|
||||
indent: 15,
|
||||
),
|
||||
GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () {
|
||||
|
||||
@ -4,9 +4,12 @@ import 'package:qinglong_app/base/http/api.dart';
|
||||
import 'package:qinglong_app/base/http/http.dart';
|
||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||
import 'package:qinglong_app/base/theme.dart';
|
||||
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||
import 'package:qinglong_app/module/config/config_viewmodel.dart';
|
||||
import 'package:qinglong_app/utils/extension.dart';
|
||||
|
||||
import '../../../main.dart';
|
||||
|
||||
class ScriptEditPage extends ConsumerStatefulWidget {
|
||||
final String content;
|
||||
final String title;
|
||||
@ -77,6 +80,7 @@ class _ScriptEditPageState extends ConsumerState<ScriptEditPage> {
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
focusNode: node,
|
||||
style: TextStyle(
|
||||
color: ref.read(themeProvider).themeColor.descColor(),
|
||||
|
||||
@ -92,6 +92,7 @@ class _UpdatePasswordPageState extends ConsumerState<UpdatePasswordPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
focusNode: focusNode,
|
||||
controller: _nameController,
|
||||
decoration: const InputDecoration(
|
||||
@ -122,6 +123,7 @@ class _UpdatePasswordPageState extends ConsumerState<UpdatePasswordPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
obscureText: true,
|
||||
controller: _passwordController,
|
||||
maxLines: 1,
|
||||
@ -153,6 +155,7 @@ class _UpdatePasswordPageState extends ConsumerState<UpdatePasswordPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: false,
|
||||
obscureText: true,
|
||||
maxLines: 1,
|
||||
controller: _passwordAgainController,
|
||||
|
||||
@ -3,10 +3,13 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:qinglong_app/base/http/api.dart';
|
||||
import 'package:qinglong_app/base/http/http.dart';
|
||||
import 'package:qinglong_app/base/ql_app_bar.dart';
|
||||
import 'package:qinglong_app/base/userinfo_viewmodel.dart';
|
||||
import 'package:qinglong_app/module/task/task_bean.dart';
|
||||
import 'package:qinglong_app/module/task/task_viewmodel.dart';
|
||||
import 'package:qinglong_app/utils/extension.dart';
|
||||
|
||||
import '../../main.dart';
|
||||
|
||||
class AddTaskPage extends ConsumerStatefulWidget {
|
||||
final TaskBean? taskBean;
|
||||
|
||||
@ -98,6 +101,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
focusNode: focusNode,
|
||||
controller: _nameController,
|
||||
decoration: const InputDecoration(
|
||||
@ -128,6 +132,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
controller: _commandController,
|
||||
maxLines: 4,
|
||||
minLines: 1,
|
||||
@ -159,6 +164,7 @@ class _AddTaskPageState extends ConsumerState<AddTaskPage> {
|
||||
),
|
||||
),
|
||||
TextField(
|
||||
enableInteractiveSelection: !getIt<UserInfoViewModel>().forbidReadClipBoarded,
|
||||
controller: _cronController,
|
||||
decoration: const InputDecoration(
|
||||
contentPadding: EdgeInsets.fromLTRB(0, 5, 0, 5),
|
||||
|
||||
Reference in New Issue
Block a user