✨ volume next ep
This commit is contained in:
parent
0172b4747a
commit
d66ff4d536
|
@ -1,5 +1,6 @@
|
||||||
v1.7.8
|
v1.7.8
|
||||||
- [x] ♻️ iOS可以使用FaceID进行解锁App
|
- [x] ♻️ iOS可以使用FaceID进行解锁App
|
||||||
|
- [x] ✨ 音量键快速翻阅下一章节(设置中开启)
|
||||||
|
|
||||||
v1.7.7
|
v1.7.7
|
||||||
- [x] 🐛 修复一些极端情况下崩溃
|
- [x] 🐛 修复一些极端情况下崩溃
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import '../Method.dart';
|
||||||
|
|
||||||
|
const _propertyName = "volumeNextChapter";
|
||||||
|
|
||||||
|
late bool _volumeNextChapter;
|
||||||
|
|
||||||
|
Future initVolumeNextChapter() async {
|
||||||
|
_volumeNextChapter =
|
||||||
|
(await method.loadProperty(_propertyName, "true")) == "true";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool volumeNextChapter() {
|
||||||
|
return _volumeNextChapter;
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget volumeNextChapterSetting() {
|
||||||
|
return StatefulBuilder(
|
||||||
|
builder: (BuildContext context, void Function(void Function()) setState) {
|
||||||
|
return SwitchListTile(
|
||||||
|
title: const Text("双击音量键下一章节"),
|
||||||
|
value: _volumeNextChapter,
|
||||||
|
onChanged: (value) async {
|
||||||
|
await method.saveProperty(_propertyName, "$value");
|
||||||
|
_volumeNextChapter = value;
|
||||||
|
setState(() {});
|
||||||
|
},
|
||||||
|
);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
|
@ -53,6 +53,7 @@ import '../basic/config/HiddenFdIcon.dart';
|
||||||
import '../basic/config/IconLoading.dart';
|
import '../basic/config/IconLoading.dart';
|
||||||
import '../basic/config/IsPro.dart';
|
import '../basic/config/IsPro.dart';
|
||||||
import '../basic/config/ReaderBackgroundColor.dart';
|
import '../basic/config/ReaderBackgroundColor.dart';
|
||||||
|
import '../basic/config/VolumeNextChapter.dart';
|
||||||
import '../basic/config/WebDav.dart';
|
import '../basic/config/WebDav.dart';
|
||||||
import 'AccountScreen.dart';
|
import 'AccountScreen.dart';
|
||||||
import 'AppScreen.dart';
|
import 'AppScreen.dart';
|
||||||
|
@ -125,6 +126,7 @@ class _InitScreenState extends State<InitScreen> {
|
||||||
await initEBookScrolling();
|
await initEBookScrolling();
|
||||||
await initEBookScrollingRange();
|
await initEBookScrollingRange();
|
||||||
await initEBookScrollingTrigger();
|
await initEBookScrollingTrigger();
|
||||||
|
await initVolumeNextChapter();
|
||||||
|
|
||||||
String? initUrl;
|
String? initUrl;
|
||||||
if (Platform.isAndroid || Platform.isIOS) {
|
if (Platform.isAndroid || Platform.isIOS) {
|
||||||
|
|
|
@ -31,6 +31,7 @@ import 'package:pikapika/basic/config/ShowCommentAtDownload.dart';
|
||||||
import 'package:pikapika/basic/config/Themes.dart';
|
import 'package:pikapika/basic/config/Themes.dart';
|
||||||
import 'package:pikapika/basic/config/TimeOffsetHour.dart';
|
import 'package:pikapika/basic/config/TimeOffsetHour.dart';
|
||||||
import 'package:pikapika/basic/config/VolumeController.dart';
|
import 'package:pikapika/basic/config/VolumeController.dart';
|
||||||
|
import 'package:pikapika/basic/config/VolumeNextChapter.dart';
|
||||||
import 'package:pikapika/screens/components/NetworkSetting.dart';
|
import 'package:pikapika/screens/components/NetworkSetting.dart';
|
||||||
import 'package:pikapika/screens/components/RightClickPop.dart';
|
import 'package:pikapika/screens/components/RightClickPop.dart';
|
||||||
|
|
||||||
|
@ -165,6 +166,7 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||||
autoFullScreenSetting(),
|
autoFullScreenSetting(),
|
||||||
fullScreenActionSetting(),
|
fullScreenActionSetting(),
|
||||||
volumeControllerSetting(),
|
volumeControllerSetting(),
|
||||||
|
volumeNextChapterSetting(),
|
||||||
keyboardControllerSetting(),
|
keyboardControllerSetting(),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
noAnimationSetting(),
|
noAnimationSetting(),
|
||||||
|
|
|
@ -5,6 +5,7 @@ import 'package:another_xlider/another_xlider.dart';
|
||||||
import 'package:event/event.dart';
|
import 'package:event/event.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'package:flutter_styled_toast/flutter_styled_toast.dart';
|
||||||
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
|
||||||
import 'package:photo_view/photo_view_gallery.dart';
|
import 'package:photo_view/photo_view_gallery.dart';
|
||||||
import 'package:pikapika/basic/Common.dart';
|
import 'package:pikapika/basic/Common.dart';
|
||||||
|
@ -27,6 +28,7 @@ import 'package:scrollable_positioned_list/scrollable_positioned_list.dart';
|
||||||
import '../../basic/config/IconLoading.dart';
|
import '../../basic/config/IconLoading.dart';
|
||||||
import '../../basic/config/ReaderBackgroundColor.dart';
|
import '../../basic/config/ReaderBackgroundColor.dart';
|
||||||
import '../../basic/config/UseApiLoadImage.dart';
|
import '../../basic/config/UseApiLoadImage.dart';
|
||||||
|
import '../../basic/config/VolumeNextChapter.dart';
|
||||||
import '../FilePhotoViewScreen.dart';
|
import '../FilePhotoViewScreen.dart';
|
||||||
import 'gesture_zoom_box.dart';
|
import 'gesture_zoom_box.dart';
|
||||||
|
|
||||||
|
@ -272,12 +274,48 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
case "DOWN":
|
case "DOWN":
|
||||||
if (_current < widget.struct.images.length - 1) {
|
if (_current < widget.struct.images.length - 1) {
|
||||||
_needJumpTo(_current + 1, true);
|
_needJumpTo(_current + 1, true);
|
||||||
|
} else {
|
||||||
|
if (volumeNextChapter()) {
|
||||||
|
final now = DateTime.now().millisecondsSinceEpoch;
|
||||||
|
if (_noticeTime + 3000 > now) {
|
||||||
|
if (_hasNextEp()) {
|
||||||
|
_onNextAction();
|
||||||
|
} else {
|
||||||
|
showToast(
|
||||||
|
"已经到头了",
|
||||||
|
context: context,
|
||||||
|
position: StyledToastPosition.center,
|
||||||
|
animation: StyledToastAnimation.scale,
|
||||||
|
reverseAnimation: StyledToastAnimation.fade,
|
||||||
|
duration: const Duration(seconds: 3),
|
||||||
|
animDuration: const Duration(milliseconds: 300),
|
||||||
|
curve: Curves.elasticOut,
|
||||||
|
reverseCurve: Curves.linear,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_noticeTime = now;
|
||||||
|
showToast(
|
||||||
|
"再次点击跳转到下一章",
|
||||||
|
context: context,
|
||||||
|
position: StyledToastPosition.center,
|
||||||
|
animation: StyledToastAnimation.scale,
|
||||||
|
reverseAnimation: StyledToastAnimation.fade,
|
||||||
|
duration: const Duration(seconds: 3),
|
||||||
|
animDuration: const Duration(milliseconds: 300),
|
||||||
|
curve: Curves.elasticOut,
|
||||||
|
reverseCurve: Curves.linear,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _noticeTime = 0;
|
||||||
|
|
||||||
late int _startIndex;
|
late int _startIndex;
|
||||||
late int _current;
|
late int _current;
|
||||||
late int _slider;
|
late int _slider;
|
||||||
|
|
Loading…
Reference in New Issue