mirror of
https://github.com/venera-app/venera.git
synced 2025-12-16 15:11:14 +00:00
Compare commits
7 Commits
upgrade-fl
...
update-alt
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2e5f78aebf | ||
|
|
068d6148ad | ||
|
|
0b261f81ba | ||
|
|
781ff2553d | ||
|
|
0ce18cd738 | ||
| 40ef8a63b0 | |||
| 053293839e |
1
.github/workflows/main.yml
vendored
1
.github/workflows/main.yml
vendored
@@ -84,6 +84,7 @@ jobs:
|
|||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
- run: rm -rf /opt/hostedtoolcache
|
||||||
- uses: subosito/flutter-action@v2
|
- uses: subosito/flutter-action@v2
|
||||||
with:
|
with:
|
||||||
channel: "stable"
|
channel: "stable"
|
||||||
|
|||||||
@@ -13,15 +13,15 @@
|
|||||||
"bundleIdentifier": "com.github.wgh136.venera",
|
"bundleIdentifier": "com.github.wgh136.venera",
|
||||||
"developerName": "wgh136",
|
"developerName": "wgh136",
|
||||||
"subtitle": "A comic reader that supports reading local and network comics",
|
"subtitle": "A comic reader that supports reading local and network comics",
|
||||||
"version": "1.6.0",
|
"version": "1.6.1",
|
||||||
"versionDate": "2025-11-01",
|
"versionDate": "2025-11-29",
|
||||||
"versionDescription": "What's Changed\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/559\r\n* \u8c03\u6574\u591a\u6536\u85cf\u5939\u6f2b\u753b\u6e90\u7684\u6536\u85cf\u72b6\u6001\u663e\u793a\u903b\u8f91 by @Ftbom in https://github.com/venera-app/venera/pull/571\r\n* Enhance onResponse to support Future and validate result type by @wgh136 in https://github.com/venera-app/venera/pull/574\r\n* [iOS] Enable full screen swipe back gesture by @liulifox233 in https://github.com/venera-app/venera/pull/575\r\n* [linux] Fix linux nhentai cover image by @4b1tQu4ntN3k0 in https://github.com/venera-app/venera/pull/578\r\n* feat: \u652f\u6301\u8fc7\u6ee4\u9605\u8bfb\u5b8c\u6210\u60c5\u51b5 by @luckyray-fan in https://github.com/venera-app/venera/pull/582\r\n* Fix chinese character issue when compressing files. Close 565 by @ynyx631 in https://github.com/venera-app/venera/pull/583\r\n* Add support for ArrayBuffer to showInputDialog. by @wgh136 in https://github.com/venera-app/venera/pull/585\r\n* Added support for localstorage when logging in via webview. by @wgh136 in https://github.com/venera-app/venera/pull/586\r\n* Fix the issue of the comic list loading infinitely. Close 584 by @ynyx631 in https://github.com/venera-app/venera/pull/588\r\n* Save data when mark all as read by @lings03 in https://github.com/venera-app/venera/pull/592\r\n* Chapter comments. by @lings03 in https://github.com/venera-app/venera/pull/593\r\n* Optimize favorite page and home page. by @lings03 in https://github.com/venera-app/venera/pull/594\r\n* Update version code by @wgh136 in https://github.com/venera-app/venera/pull/596\r\n* Fix missing depends in deb package. Close 587 by @wgh136 in https://github.com/venera-app/venera/pull/597\r\n* feat: \u672c\u5730\u6536\u85cf\u641c\u7d22\u652f\u6301\u8f6c\u5c0f\u5199\u5339\u914d by @luckyray-fan in https://github.com/venera-app/venera/pull/598\r\n* Fix editor page gesture confict by @liulifox233 in https://github.com/venera-app/venera/pull/600\r \nNew Contributors\r\n* @github-actions[bot] made their first contribution in https://github.com/venera-app/venera/pull/559\r\n* @Ftbom made their first contribution in https://github.com/venera-app/venera/pull/571\r\n* @liulifox233 made their first contribution in https://github.com/venera-app/venera/pull/575\r\n* @4b1tQu4ntN3k0 made their first contribution in https://github.com/venera-app/venera/pull/578\r\n* @ynyx631 made their first contribution in https://github.com/venera-app/venera/pull/583\r \nFull Changelog: https://github.com/venera-app/venera/compare/v1.5.3...v1.6.0",
|
"versionDescription": "What's Changed\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/602\r\n* Add encryptAes for js_engine by @liulifox233 in https://github.com/venera-app/venera/pull/645\r\n* Optimize iOS full-screen back gesture implementation by @liulifox233 in https://github.com/venera-app/venera/pull/643\r\n* Fix landscape reader layout and wrap long settings labels by @boa-z in https://github.com/venera-app/venera/pull/640\r\n* Enhance Cloudflare challenge detection logic by @Y-Ymeow in https://github.com/venera-app/venera/pull/619\r\n* interceptor: mask log by @Pacalini in https://github.com/venera-app/venera/pull/618\r\n* feat: skip sync setting by @Pacalini in https://github.com/venera-app/venera/pull/563\r\n* flutter 3.38.3 by @wgh136 in https://github.com/venera-app/venera/pull/648\r\n* fix: enable multi-select actions in local comics search mode by @wgh136 in https://github.com/venera-app/venera/pull/650\r\n* feat: add comment keyword blocking functionality by @wgh136 in https://github.com/venera-app/venera/pull/649\r \nNew Contributors\r\n* @Y-Ymeow made their first contribution in https://github.com/venera-app/venera/pull/619\r \nFull Changelog: https://github.com/venera-app/venera/compare/v1.6.0...v1.6.1",
|
||||||
"downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.0/venera-ios-1.6.0%2B160.ipa",
|
"downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.1/venera-ios-1.6.1%2B161.ipa",
|
||||||
"localizedDescription": "A comic reader that supports reading local and network comics",
|
"localizedDescription": "A comic reader that supports reading local and network comics",
|
||||||
"iconURL": "https://raw.githubusercontent.com/venera-app/venera/master/assets/app_icon.png",
|
"iconURL": "https://raw.githubusercontent.com/venera-app/venera/master/assets/app_icon.png",
|
||||||
"tintColor": "#0784FC",
|
"tintColor": "#0784FC",
|
||||||
"category": "utilities",
|
"category": "utilities",
|
||||||
"size": 15064741,
|
"size": 15202312,
|
||||||
"appPermissions": {
|
"appPermissions": {
|
||||||
"entitlements": [
|
"entitlements": [
|
||||||
"application-identifier",
|
"application-identifier",
|
||||||
@@ -39,6 +39,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"versions": [
|
"versions": [
|
||||||
|
{
|
||||||
|
"version": "1.6.1",
|
||||||
|
"date": "2025-11-29",
|
||||||
|
"localizedDescription": "What's Changed\r\n* Update AltStore source with latest release by @github-actions[bot] in https://github.com/venera-app/venera/pull/602\r\n* Add encryptAes for js_engine by @liulifox233 in https://github.com/venera-app/venera/pull/645\r\n* Optimize iOS full-screen back gesture implementation by @liulifox233 in https://github.com/venera-app/venera/pull/643\r\n* Fix landscape reader layout and wrap long settings labels by @boa-z in https://github.com/venera-app/venera/pull/640\r\n* Enhance Cloudflare challenge detection logic by @Y-Ymeow in https://github.com/venera-app/venera/pull/619\r\n* interceptor: mask log by @Pacalini in https://github.com/venera-app/venera/pull/618\r\n* feat: skip sync setting by @Pacalini in https://github.com/venera-app/venera/pull/563\r\n* flutter 3.38.3 by @wgh136 in https://github.com/venera-app/venera/pull/648\r\n* fix: enable multi-select actions in local comics search mode by @wgh136 in https://github.com/venera-app/venera/pull/650\r\n* feat: add comment keyword blocking functionality by @wgh136 in https://github.com/venera-app/venera/pull/649\r \nNew Contributors\r\n* @Y-Ymeow made their first contribution in https://github.com/venera-app/venera/pull/619\r \nFull Changelog: https://github.com/venera-app/venera/compare/v1.6.0...v1.6.1",
|
||||||
|
"downloadURL": "https://github.com/venera-app/venera/releases/download/v1.6.1/venera-ios-1.6.1%2B161.ipa",
|
||||||
|
"size": 15202312
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "1.6.0",
|
"version": "1.6.0",
|
||||||
"date": "2025-11-01",
|
"date": "2025-11-01",
|
||||||
@@ -93,6 +100,16 @@
|
|||||||
"tintColor": "#0784FC",
|
"tintColor": "#0784FC",
|
||||||
"title": "v1.6.0 - Venera 01/11/25",
|
"title": "v1.6.0 - Venera 01/11/25",
|
||||||
"url": "https://github.com/venera-app/venera/releases/tag/v1.6.0"
|
"url": "https://github.com/venera-app/venera/releases/tag/v1.6.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"appID": "com.github.wgh136.venera",
|
||||||
|
"caption": "Update of Venera just got released!",
|
||||||
|
"date": "2025-11-29T08:51:14Z",
|
||||||
|
"identifier": "release-v1.6.1",
|
||||||
|
"notify": true,
|
||||||
|
"tintColor": "#0784FC",
|
||||||
|
"title": "v1.6.1 - Venera 29/11/25",
|
||||||
|
"url": "https://github.com/venera-app/venera/releases/tag/v1.6.1"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -103,6 +103,7 @@
|
|||||||
"Show favorite status on comic tile": "在漫画缩略图上显示收藏状态",
|
"Show favorite status on comic tile": "在漫画缩略图上显示收藏状态",
|
||||||
"Show history on comic tile": "在漫画缩略图上显示历史记录",
|
"Show history on comic tile": "在漫画缩略图上显示历史记录",
|
||||||
"Keyword blocking": "关键词屏蔽",
|
"Keyword blocking": "关键词屏蔽",
|
||||||
|
"Comment keyword blocking": "评论关键词屏蔽",
|
||||||
"Tap to turn Pages": "点击翻页",
|
"Tap to turn Pages": "点击翻页",
|
||||||
"Page animation": "页面动画",
|
"Page animation": "页面动画",
|
||||||
"Reading mode": "阅读模式",
|
"Reading mode": "阅读模式",
|
||||||
@@ -529,6 +530,7 @@
|
|||||||
"Show favorite status on comic tile": "在漫畫縮圖上顯示收藏狀態",
|
"Show favorite status on comic tile": "在漫畫縮圖上顯示收藏狀態",
|
||||||
"Show history on comic tile": "在漫畫縮圖上顯示歷史記錄",
|
"Show history on comic tile": "在漫畫縮圖上顯示歷史記錄",
|
||||||
"Keyword blocking": "關鍵字封鎖",
|
"Keyword blocking": "關鍵字封鎖",
|
||||||
|
"Comment keyword blocking": "評論關鍵字封鎖",
|
||||||
"Tap to turn Pages": "點擊翻頁",
|
"Tap to turn Pages": "點擊翻頁",
|
||||||
"Page animation": "頁面動畫",
|
"Page animation": "頁面動畫",
|
||||||
"Reading mode": "閱讀模式",
|
"Reading mode": "閱讀模式",
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export "widget_utils.dart";
|
|||||||
export "context.dart";
|
export "context.dart";
|
||||||
|
|
||||||
class _App {
|
class _App {
|
||||||
final version = "1.6.0";
|
final version = "1.6.1";
|
||||||
|
|
||||||
bool get isAndroid => Platform.isAndroid;
|
bool get isAndroid => Platform.isAndroid;
|
||||||
|
|
||||||
|
|||||||
@@ -180,6 +180,7 @@ class Settings with ChangeNotifier {
|
|||||||
'showFavoriteStatusOnTile': true,
|
'showFavoriteStatusOnTile': true,
|
||||||
'showHistoryStatusOnTile': false,
|
'showHistoryStatusOnTile': false,
|
||||||
'blockedWords': [],
|
'blockedWords': [],
|
||||||
|
'blockedCommentWords': [],
|
||||||
'defaultSearchTarget': null,
|
'defaultSearchTarget': null,
|
||||||
'autoPageTurningInterval': 5, // in seconds
|
'autoPageTurningInterval': 5, // in seconds
|
||||||
'readerMode': 'galleryLeftToRight', // values of [ReaderMode]
|
'readerMode': 'galleryLeftToRight', // values of [ReaderMode]
|
||||||
|
|||||||
@@ -1,5 +1,18 @@
|
|||||||
part of 'comic_page.dart';
|
part of 'comic_page.dart';
|
||||||
|
|
||||||
|
bool _shouldBlockComment(Comment comment) {
|
||||||
|
var blockedWords = appdata.settings["blockedCommentWords"] as List;
|
||||||
|
if (blockedWords.isEmpty) return false;
|
||||||
|
|
||||||
|
var content = comment.content.toLowerCase();
|
||||||
|
for (var word in blockedWords) {
|
||||||
|
if (content.contains(word.toString().toLowerCase())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
class CommentsPage extends StatefulWidget {
|
class CommentsPage extends StatefulWidget {
|
||||||
const CommentsPage({
|
const CommentsPage({
|
||||||
super.key,
|
super.key,
|
||||||
@@ -36,8 +49,9 @@ class _CommentsPageState extends State<CommentsPage> {
|
|||||||
_loading = false;
|
_loading = false;
|
||||||
});
|
});
|
||||||
} else if (mounted) {
|
} else if (mounted) {
|
||||||
|
var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();
|
||||||
setState(() {
|
setState(() {
|
||||||
_comments = res.data;
|
_comments = filteredComments;
|
||||||
_loading = false;
|
_loading = false;
|
||||||
maxPage = res.subData;
|
maxPage = res.subData;
|
||||||
});
|
});
|
||||||
@@ -54,8 +68,9 @@ class _CommentsPageState extends State<CommentsPage> {
|
|||||||
if (res.error) {
|
if (res.error) {
|
||||||
context.showMessage(message: res.errorMessage ?? "Unknown Error");
|
context.showMessage(message: res.errorMessage ?? "Unknown Error");
|
||||||
} else {
|
} else {
|
||||||
|
var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();
|
||||||
setState(() {
|
setState(() {
|
||||||
_comments!.addAll(res.data);
|
_comments!.addAll(filteredComments);
|
||||||
_page++;
|
_page++;
|
||||||
if (maxPage == null && res.data.isEmpty) {
|
if (maxPage == null && res.data.isEmpty) {
|
||||||
maxPage = _page;
|
maxPage = _page;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class _CommentsPartState extends State<_CommentsPart> {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
comments = widget.comments;
|
comments = widget.comments.where((c) => !_shouldBlockComment(c)).toList();
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -258,29 +258,41 @@ class _LocalComicsPageState extends State<LocalComicsPage> {
|
|||||||
else if (searchMode)
|
else if (searchMode)
|
||||||
SliverAppbar(
|
SliverAppbar(
|
||||||
leading: Tooltip(
|
leading: Tooltip(
|
||||||
message: "Cancel".tl,
|
message: multiSelectMode ? "Cancel".tl : "Cancel".tl,
|
||||||
child: IconButton(
|
child: IconButton(
|
||||||
icon: const Icon(Icons.close),
|
icon: multiSelectMode
|
||||||
|
? const Icon(Icons.close)
|
||||||
|
: const Icon(Icons.close),
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
setState(() {
|
if (multiSelectMode) {
|
||||||
searchMode = false;
|
setState(() {
|
||||||
keyword = "";
|
multiSelectMode = false;
|
||||||
update();
|
selectedComics.clear();
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
searchMode = false;
|
||||||
|
keyword = "";
|
||||||
|
update();
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
title: TextField(
|
title: multiSelectMode
|
||||||
autofocus: true,
|
? Text(selectedComics.length.toString())
|
||||||
decoration: InputDecoration(
|
: TextField(
|
||||||
hintText: "Search".tl,
|
autofocus: true,
|
||||||
border: InputBorder.none,
|
decoration: InputDecoration(
|
||||||
),
|
hintText: "Search".tl,
|
||||||
onChanged: (v) {
|
border: InputBorder.none,
|
||||||
keyword = v;
|
),
|
||||||
update();
|
onChanged: (v) {
|
||||||
},
|
keyword = v;
|
||||||
),
|
update();
|
||||||
|
},
|
||||||
|
),
|
||||||
|
actions: multiSelectMode ? selectActions : null,
|
||||||
),
|
),
|
||||||
SliverGridComics(
|
SliverGridComics(
|
||||||
comics: comics,
|
comics: comics,
|
||||||
@@ -344,6 +356,7 @@ class _LocalComicsPageState extends State<LocalComicsPage> {
|
|||||||
return PopScope(
|
return PopScope(
|
||||||
canPop: !multiSelectMode && !searchMode,
|
canPop: !multiSelectMode && !searchMode,
|
||||||
onPopInvokedWithResult: (didPop, result) {
|
onPopInvokedWithResult: (didPop, result) {
|
||||||
|
if (didPop) return;
|
||||||
if (multiSelectMode) {
|
if (multiSelectMode) {
|
||||||
setState(() {
|
setState(() {
|
||||||
multiSelectMode = false;
|
multiSelectMode = false;
|
||||||
|
|||||||
@@ -1,5 +1,18 @@
|
|||||||
part of 'reader.dart';
|
part of 'reader.dart';
|
||||||
|
|
||||||
|
bool _shouldBlockComment(Comment comment) {
|
||||||
|
var blockedWords = appdata.settings["blockedCommentWords"] as List;
|
||||||
|
if (blockedWords.isEmpty) return false;
|
||||||
|
|
||||||
|
var content = comment.content.toLowerCase();
|
||||||
|
for (var word in blockedWords) {
|
||||||
|
if (content.contains(word.toString().toLowerCase())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
class ChapterCommentsPage extends StatefulWidget {
|
class ChapterCommentsPage extends StatefulWidget {
|
||||||
const ChapterCommentsPage({
|
const ChapterCommentsPage({
|
||||||
super.key,
|
super.key,
|
||||||
@@ -44,8 +57,9 @@ class _ChapterCommentsPageState extends State<ChapterCommentsPage> {
|
|||||||
_loading = false;
|
_loading = false;
|
||||||
});
|
});
|
||||||
} else if (mounted) {
|
} else if (mounted) {
|
||||||
|
var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();
|
||||||
setState(() {
|
setState(() {
|
||||||
_comments = res.data;
|
_comments = filteredComments;
|
||||||
_loading = false;
|
_loading = false;
|
||||||
maxPage = res.subData;
|
maxPage = res.subData;
|
||||||
});
|
});
|
||||||
@@ -62,8 +76,9 @@ class _ChapterCommentsPageState extends State<ChapterCommentsPage> {
|
|||||||
if (res.error) {
|
if (res.error) {
|
||||||
context.showMessage(message: res.errorMessage ?? "Unknown Error");
|
context.showMessage(message: res.errorMessage ?? "Unknown Error");
|
||||||
} else {
|
} else {
|
||||||
|
var filteredComments = res.data.where((c) => !_shouldBlockComment(c)).toList();
|
||||||
setState(() {
|
setState(() {
|
||||||
_comments!.addAll(res.data);
|
_comments!.addAll(filteredComments);
|
||||||
_page++;
|
_page++;
|
||||||
if (maxPage == null && res.data.isEmpty) {
|
if (maxPage == null && res.data.isEmpty) {
|
||||||
maxPage = _page;
|
maxPage = _page;
|
||||||
|
|||||||
@@ -60,6 +60,10 @@ class _ExploreSettingsState extends State<ExploreSettings> {
|
|||||||
title: "Keyword blocking".tl,
|
title: "Keyword blocking".tl,
|
||||||
builder: () => const _ManageBlockingWordView(),
|
builder: () => const _ManageBlockingWordView(),
|
||||||
).toSliver(),
|
).toSliver(),
|
||||||
|
_PopupWindowSetting(
|
||||||
|
title: "Comment keyword blocking".tl,
|
||||||
|
builder: () => const _ManageBlockingCommentWordView(),
|
||||||
|
).toSliver(),
|
||||||
SelectSetting(
|
SelectSetting(
|
||||||
title: "Default Search Target".tl,
|
title: "Default Search Target".tl,
|
||||||
settingKey: "defaultSearchTarget",
|
settingKey: "defaultSearchTarget",
|
||||||
@@ -250,4 +254,93 @@ Widget setSearchSourcesWidget() {
|
|||||||
settingsIndex: "searchSources",
|
settingsIndex: "searchSources",
|
||||||
pages: pages,
|
pages: pages,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ManageBlockingCommentWordView extends StatefulWidget {
|
||||||
|
const _ManageBlockingCommentWordView();
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<_ManageBlockingCommentWordView> createState() =>
|
||||||
|
_ManageBlockingCommentWordViewState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _ManageBlockingCommentWordViewState extends State<_ManageBlockingCommentWordView> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
assert(appdata.settings["blockedCommentWords"] is List);
|
||||||
|
return PopUpWidgetScaffold(
|
||||||
|
title: "Comment keyword blocking".tl,
|
||||||
|
tailing: [
|
||||||
|
TextButton.icon(
|
||||||
|
icon: const Icon(Icons.add),
|
||||||
|
label: Text("Add".tl),
|
||||||
|
onPressed: add,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
body: ListView.builder(
|
||||||
|
itemCount: appdata.settings["blockedCommentWords"].length,
|
||||||
|
itemBuilder: (context, index) {
|
||||||
|
return ListTile(
|
||||||
|
title: Text(appdata.settings["blockedCommentWords"][index]),
|
||||||
|
trailing: IconButton(
|
||||||
|
icon: const Icon(Icons.close),
|
||||||
|
onPressed: () {
|
||||||
|
appdata.settings["blockedCommentWords"].removeAt(index);
|
||||||
|
appdata.saveData();
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void add() {
|
||||||
|
showDialog(
|
||||||
|
context: App.rootContext,
|
||||||
|
builder: (context) {
|
||||||
|
var controller = TextEditingController();
|
||||||
|
String? error;
|
||||||
|
return StatefulBuilder(builder: (context, setState) {
|
||||||
|
return ContentDialog(
|
||||||
|
title: "Add keyword".tl,
|
||||||
|
content: TextField(
|
||||||
|
controller: controller,
|
||||||
|
decoration: InputDecoration(
|
||||||
|
border: const OutlineInputBorder(),
|
||||||
|
label: Text("Keyword".tl),
|
||||||
|
errorText: error,
|
||||||
|
),
|
||||||
|
onChanged: (s) {
|
||||||
|
if (error != null) {
|
||||||
|
setState(() {
|
||||||
|
error = null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
).paddingHorizontal(12),
|
||||||
|
actions: [
|
||||||
|
Button.filled(
|
||||||
|
onPressed: () {
|
||||||
|
if (appdata.settings["blockedCommentWords"]
|
||||||
|
.contains(controller.text)) {
|
||||||
|
setState(() {
|
||||||
|
error = "Keyword already exists".tl;
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
appdata.settings["blockedCommentWords"].add(controller.text);
|
||||||
|
appdata.saveData();
|
||||||
|
this.setState(() {});
|
||||||
|
context.pop();
|
||||||
|
},
|
||||||
|
child: Text("Add".tl),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,7 @@ name: venera
|
|||||||
description: "A comic app."
|
description: "A comic app."
|
||||||
publish_to: 'none'
|
publish_to: 'none'
|
||||||
|
|
||||||
version: 1.6.0+160
|
version: 1.6.1+161
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=3.8.0 <4.0.0'
|
sdk: '>=3.8.0 <4.0.0'
|
||||||
|
|||||||
Reference in New Issue
Block a user