Skip to content

Commit 762b381

Browse files
committed
🚀 1.8.10
1 parent 0f30d8e commit 762b381

File tree

8 files changed

+247
-2
lines changed

8 files changed

+247
-2
lines changed

ci/version.code.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v1.8.9
1+
v1.8.10

ci/version.info.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
v1.8.9
22

33
- [x] ✨ 移动端可以设置APP方向(在设置中)
4+
- [x] ✨ 根据关键字屏蔽
45
- [x] 💄 更新启动图
56
- [x] 🐛 修复iOS不能设置夜间主题
67

lib/basic/config/HiddenWords.dart

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import 'dart:convert';
2+
import 'package:flutter/material.dart';
3+
4+
import '../../screens/HiddenWordsScreen.dart';
5+
import '../Method.dart';
6+
7+
const _key = "hiddenWords";
8+
9+
final List<String> _hiddenWords = [];
10+
11+
List<String> get hiddenWords => _hiddenWords;
12+
13+
Future<String> initHiddenWords() async {
14+
final words = await method.loadProperty(_key, "[]");
15+
_hiddenWords.clear();
16+
_hiddenWords.addAll((jsonDecode(words) as List).cast<String>());
17+
return words;
18+
}
19+
20+
Future<void> saveHiddenWords(List<String> words) async {
21+
_hiddenWords.clear();
22+
_hiddenWords.addAll(words);
23+
await method.saveProperty(_key, jsonEncode(words));
24+
}
25+
26+
Future<void> addHiddenWord(String word) async {
27+
if (word.trim().isEmpty) return;
28+
if (!_hiddenWords.contains(word)) {
29+
_hiddenWords.add(word);
30+
await method.saveProperty(_key, jsonEncode(_hiddenWords));
31+
}
32+
}
33+
34+
Future<void> removeHiddenWord(String word) async {
35+
_hiddenWords.remove(word);
36+
await method.saveProperty(_key, jsonEncode(_hiddenWords));
37+
}
38+
39+
Future<void> clearHiddenWords() async {
40+
_hiddenWords.clear();
41+
await method.saveProperty(_key, "[]");
42+
}
43+
44+
Widget hiddenWordsSetting() {
45+
return StatefulBuilder(
46+
builder: (BuildContext context, void Function(void Function()) setState) {
47+
return ListTile(
48+
title: const Text("根据关键字封印"),
49+
subtitle: Text(subString(jsonEncode(_hiddenWords))),
50+
onTap: () async {
51+
await Navigator.of(context).push(MaterialPageRoute(
52+
builder: (context) => const HiddenWordsScreen(),
53+
));
54+
setState(() {});
55+
},
56+
);
57+
},
58+
);
59+
}
60+
61+
String subString(String str) {
62+
if (str.length > 20) {
63+
return str.substring(0, 20) + "...";
64+
}
65+
return str;
66+
}

lib/screens/HiddenWordsScreen.dart

Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
import 'package:flutter/material.dart';
2+
import '../basic/config/HiddenWords.dart';
3+
import 'components/RightClickPop.dart';
4+
import 'components/ListView.dart';
5+
import 'components/ContentBuilder.dart';
6+
7+
class HiddenWordsScreen extends StatefulWidget {
8+
const HiddenWordsScreen({Key? key}) : super(key: key);
9+
10+
@override
11+
State<StatefulWidget> createState() => _HiddenWordsScreenState();
12+
}
13+
14+
class _HiddenWordsScreenState extends State<HiddenWordsScreen> {
15+
late Future<String> _future = initHiddenWords();
16+
late Key _key = UniqueKey();
17+
final TextEditingController _textController = TextEditingController();
18+
19+
Future<void> _addWord() async {
20+
if (_textController.text.trim().isEmpty) return;
21+
await addHiddenWord(_textController.text.trim());
22+
_textController.clear();
23+
setState(() {
24+
_future = initHiddenWords();
25+
_key = UniqueKey();
26+
});
27+
}
28+
29+
Future<void> _removeWord(String word) async {
30+
await removeHiddenWord(word);
31+
setState(() {
32+
_future = initHiddenWords();
33+
_key = UniqueKey();
34+
});
35+
}
36+
37+
Future<void> _clearAll() async {
38+
await clearHiddenWords();
39+
setState(() {
40+
_future = initHiddenWords();
41+
_key = UniqueKey();
42+
});
43+
}
44+
45+
@override
46+
void dispose() {
47+
_textController.dispose();
48+
super.dispose();
49+
}
50+
51+
@override
52+
Widget build(BuildContext context) {
53+
return rightClickPop(
54+
child: buildScreen(context),
55+
context: context,
56+
canPop: true,
57+
);
58+
}
59+
60+
Widget buildScreen(BuildContext context) {
61+
return Scaffold(
62+
appBar: AppBar(
63+
title: const Text('隐藏词管理'),
64+
actions: [
65+
IconButton(
66+
icon: const Icon(Icons.delete_sweep),
67+
onPressed: () async {
68+
bool? confirm = await showDialog<bool>(
69+
context: context,
70+
builder: (context) => AlertDialog(
71+
title: const Text('确认清空'),
72+
content: const Text('确定要清空所有隐藏词吗?'),
73+
actions: [
74+
TextButton(
75+
onPressed: () => Navigator.of(context).pop(false),
76+
child: const Text('取消'),
77+
),
78+
TextButton(
79+
onPressed: () => Navigator.of(context).pop(true),
80+
child: const Text('确定'),
81+
),
82+
],
83+
),
84+
);
85+
if (confirm == true) {
86+
await _clearAll();
87+
}
88+
},
89+
),
90+
],
91+
),
92+
body: Column(
93+
children: [
94+
Padding(
95+
padding: const EdgeInsets.all(16.0),
96+
child: Row(
97+
children: [
98+
Expanded(
99+
child: TextField(
100+
controller: _textController,
101+
decoration: const InputDecoration(
102+
hintText: '输入要隐藏的词',
103+
border: OutlineInputBorder(),
104+
),
105+
onSubmitted: (_) => _addWord(),
106+
),
107+
),
108+
const SizedBox(width: 8),
109+
IconButton(
110+
icon: const Icon(Icons.add),
111+
onPressed: _addWord,
112+
),
113+
],
114+
),
115+
),
116+
Expanded(
117+
child: ContentBuilder(
118+
key: _key,
119+
future: _future,
120+
onRefresh: () async {
121+
setState(() {
122+
_future = initHiddenWords();
123+
_key = UniqueKey();
124+
});
125+
},
126+
successBuilder: (BuildContext context, AsyncSnapshot<String> snapshot) {
127+
if (hiddenWords.isEmpty) {
128+
return const Center(
129+
child: Text('暂无隐藏词'),
130+
);
131+
}
132+
return PikaListView(
133+
children: hiddenWords.map((word) => ListTile(
134+
title: Text(word),
135+
trailing: IconButton(
136+
icon: const Icon(Icons.delete),
137+
onPressed: () => _removeWord(word),
138+
),
139+
)).toList(),
140+
);
141+
},
142+
),
143+
),
144+
],
145+
),
146+
);
147+
}
148+
}

lib/screens/InitScreen.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ import '../basic/config/DownloadCachePath.dart';
5858
import '../basic/config/ExportPath.dart';
5959
import '../basic/config/ExportRename.dart';
6060
import '../basic/config/HiddenFdIcon.dart';
61+
import '../basic/config/HiddenWords.dart';
6162
import '../basic/config/IconLoading.dart';
6263
import '../basic/config/IsPro.dart';
6364
import '../basic/config/ReaderBackgroundColor.dart';
@@ -145,6 +146,7 @@ class _InitScreenState extends State<InitScreen> {
145146
await initHiddenSearchPersion();
146147
await initLockTimeOut();
147148
await initReaderTwoPageDirection();
149+
await initHiddenWords();
148150
String? initUrl;
149151
if (Platform.isAndroid || Platform.isIOS) {
150152
try {

lib/screens/SettingsScreen.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import '../basic/config/DownloadCachePath.dart';
4646
import '../basic/config/EBookScrolling.dart';
4747
import '../basic/config/HiddenFdIcon.dart';
4848
import '../basic/config/HiddenSubIcon.dart';
49+
import '../basic/config/HiddenWords.dart';
4950
import '../basic/config/ImageFilter.dart';
5051
import '../basic/config/LocalHistorySync.dart';
5152
import '../basic/config/ReaderTwoPageDirection.dart';
@@ -58,6 +59,7 @@ import 'MigrateScreen.dart';
5859
import 'ModifyPasswordScreen.dart';
5960
import 'ThemeScreen.dart';
6061
import 'WebServerScreen.dart';
62+
import 'HiddenWordsScreen.dart';
6163

6264
class SettingsScreen extends StatefulWidget {
6365
final bool hiddenAccountInfo;
@@ -134,6 +136,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
134136
const Divider(),
135137
shadowCategoriesModeSetting(),
136138
shadowCategoriesSetting(),
139+
hiddenWordsSetting(),
137140
],
138141
),
139142
ExpansionTile(

lib/screens/components/ComicList.dart

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
55
import 'package:pikapika/basic/Common.dart';
66
import 'package:pikapika/basic/Entities.dart';
77
import 'package:pikapika/basic/Method.dart';
8+
import 'package:pikapika/basic/config/HiddenWords.dart';
89
import 'package:pikapika/basic/config/ShadowCategories.dart';
910
import 'package:pikapika/basic/config/ListLayout.dart';
1011
import 'package:pikapika/basic/config/ShadowCategoriesMode.dart';
@@ -146,6 +147,14 @@ class _ComicListState extends State<ComicList> {
146147
shadow = true;
147148
break;
148149
}
150+
if (!shadow) {
151+
for (var value in hiddenWords) {
152+
if (e.title.toLowerCase().contains(value.toLowerCase()) || e.author.toLowerCase().contains(value.toLowerCase())) {
153+
shadow = true;
154+
break;
155+
}
156+
}
157+
}
149158
if (shadow) {
150159
return InkWell(
151160
onTap: () {},
@@ -282,6 +291,14 @@ class _ComicListState extends State<ComicList> {
282291
shadow = true;
283292
break;
284293
}
294+
if (!shadow) {
295+
for (var value in hiddenWords) {
296+
if (e.title.toLowerCase().contains(value.toLowerCase()) || e.author.toLowerCase().contains(value.toLowerCase())) {
297+
shadow = true;
298+
break;
299+
}
300+
}
301+
}
285302
if (shadow) {
286303
tmp.add(
287304
Container(
@@ -463,6 +480,14 @@ class _ComicListState extends State<ComicList> {
463480
shadow = true;
464481
break;
465482
}
483+
if (!shadow) {
484+
for (var value in hiddenWords) {
485+
if (e.title.toLowerCase().contains(value.toLowerCase()) || e.author.toLowerCase().contains(value.toLowerCase())) {
486+
shadow = true;
487+
break;
488+
}
489+
}
490+
}
466491
if (shadow) {
467492
tmp.add(
468493
Container(

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
1515
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
1616
# Read more about iOS versioning at
1717
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
18-
version: 1.8.9+33
18+
version: 1.8.10+34
1919

2020
environment:
2121
sdk: ">=2.12.0 <3.0.0"

0 commit comments

Comments
 (0)