增加剪切板控制

This commit is contained in:
jyuesong
2022-01-20 16:13:08 +08:00
parent d4e8dec698
commit f389f32d32
10 changed files with 103 additions and 5 deletions

View File

@ -4,3 +4,4 @@ String spUserName = "username";
String spPassWord = "password";
String spTheme = "dart_mode";
String spSecretLogined = "secret_logined";
String spForbidClipBoard = "forbid_read_clipboard";

View File

@ -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;
}

View File

@ -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(),

View File

@ -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: "请输入备注",

View File

@ -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(

View File

@ -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),

View File

@ -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: () {

View File

@ -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(),

View File

@ -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,

View File

@ -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),