Upgrade to v1.5.1
This commit is contained in:
parent
46403f41fb
commit
087b09fe68
|
@ -1 +1 @@
|
||||||
v1.4.6
|
v1.5.1
|
|
@ -1,3 +1,4 @@
|
||||||
- [x] 修复 分流2 / 分流3, API速度得到提高
|
- [x] 修复一些BUG
|
||||||
- [x] 看此本子多人也在看
|
- [x] 优化阅读器 (之前丢了一部分代码, 导致被回滚了, 全屏按钮重新写了一遍)
|
||||||
- [x] 本子神推荐/魔推荐
|
- [x] 优化导入导出 / 保存图片等文件系统交互操作
|
||||||
|
- [x] 优化推荐栏目
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:clipboard/clipboard.dart';
|
import 'package:clipboard/clipboard.dart';
|
||||||
import 'package:filesystem_picker/filesystem_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
import 'package:pikapika/basic/Common.dart';
|
import 'package:pikapika/basic/Common.dart';
|
||||||
|
@ -77,13 +77,12 @@ Future<dynamic> _saveImageAndroid(String path, BuildContext context) async {
|
||||||
|
|
||||||
/// 选择一个文件夹用于保存文件
|
/// 选择一个文件夹用于保存文件
|
||||||
Future<String?> chooseFolder(BuildContext context) async {
|
Future<String?> chooseFolder(BuildContext context) async {
|
||||||
return FilesystemPicker.open(
|
return FilePicker.platform.getDirectoryPath(
|
||||||
title: '选择一个文件夹',
|
dialogTitle: "选择一个文件夹, 将文件保存到这里",
|
||||||
pickText: '将文件保存到这里',
|
initialDirectory: Directory
|
||||||
context: context,
|
.fromUri(Uri.file(await currentChooserRoot()))
|
||||||
fsType: FilesystemType.folder,
|
.absolute
|
||||||
rootDirectory:
|
.path,
|
||||||
Directory.fromUri(Uri.file(await currentChooserRoot())).absolute,
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,12 @@ class _ComicCollectionsScreenState extends State<ComicCollectionsScreen> {
|
||||||
color: appBarTheme.backgroundColor,
|
color: appBarTheme.backgroundColor,
|
||||||
child: TabBar(
|
child: TabBar(
|
||||||
indicatorColor: theme.dividerColor,
|
indicatorColor: theme.dividerColor,
|
||||||
tabs: collection.map((e) => Tab(text: e.title)).toList(),
|
tabs: collection
|
||||||
|
.map((e) => Tab(
|
||||||
|
text: e.title.indexOf("推薦") > 0
|
||||||
|
? e.title.substring(0, e.title.indexOf("推薦"))
|
||||||
|
: e.title))
|
||||||
|
.toList(),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: TabBarView(
|
body: TabBarView(
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:filesystem_picker/filesystem_picker.dart';
|
import 'package:file_picker/file_picker.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:pikapika/basic/Channels.dart';
|
import 'package:pikapika/basic/Channels.dart';
|
||||||
import 'package:pikapika/basic/Common.dart';
|
import 'package:pikapika/basic/Common.dart';
|
||||||
|
@ -43,7 +43,7 @@ class _DownloadImportScreenState extends State<DownloadImportScreen> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context){
|
Widget build(BuildContext context) {
|
||||||
return rightClickPop(
|
return rightClickPop(
|
||||||
child: buildScreen(context),
|
child: buildScreen(context),
|
||||||
context: context,
|
context: context,
|
||||||
|
@ -96,15 +96,15 @@ class _DownloadImportScreenState extends State<DownloadImportScreen> {
|
||||||
defaultToast(context, "$e");
|
defaultToast(context, "$e");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String? path = await FilesystemPicker.open(
|
var ls = await FilePicker.platform.pickFiles(
|
||||||
title: '选择要导入的文件',
|
dialogTitle: '选择要导入的文件',
|
||||||
context: context,
|
allowMultiple: false,
|
||||||
rootDirectory: Directory(chooseRoot),
|
initialDirectory: chooseRoot,
|
||||||
fsType: FilesystemType.file,
|
type: FileType.custom,
|
||||||
folderIconColor: Colors.teal,
|
allowedExtensions: ['zip'],
|
||||||
allowedExtensions: ['.zip'],
|
allowCompression: false,
|
||||||
fileTileSelectMode: FileTileSelectMode.wholeTile,
|
|
||||||
);
|
);
|
||||||
|
String? path = ls != null && ls.count > 0 ? ls.paths[0] : null;
|
||||||
if (path != null) {
|
if (path != null) {
|
||||||
try {
|
try {
|
||||||
setState(() {
|
setState(() {
|
||||||
|
|
|
@ -30,7 +30,7 @@ import 'Images.dart';
|
||||||
///////////////
|
///////////////
|
||||||
|
|
||||||
Event<_ReaderControllerEventArgs> _readerControllerEvent =
|
Event<_ReaderControllerEventArgs> _readerControllerEvent =
|
||||||
Event<_ReaderControllerEventArgs>();
|
Event<_ReaderControllerEventArgs>();
|
||||||
|
|
||||||
class _ReaderControllerEventArgs extends EventArgs {
|
class _ReaderControllerEventArgs extends EventArgs {
|
||||||
final String key;
|
final String key;
|
||||||
|
@ -289,21 +289,53 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
|
switch (currentFullScreenAction()) {
|
||||||
|
// 按钮
|
||||||
|
case FullScreenAction.CONTROLLER:
|
||||||
return Stack(
|
return Stack(
|
||||||
children: [
|
children: [
|
||||||
_buildViewer(),
|
_buildViewer(),
|
||||||
_buildBar(),
|
_buildBar(_buildFullScreenControllerStackItem()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
case FullScreenAction.TOUCH_ONCE:
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
_buildTouchOnceControllerAction(_buildViewer()),
|
||||||
|
_buildBar(Container()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
case FullScreenAction.TOUCH_DOUBLE:
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
_buildTouchDoubleControllerAction(_buildViewer()),
|
||||||
|
_buildBar(Container()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
case FullScreenAction.TOUCH_DOUBLE_ONCE_NEXT:
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
_buildTouchDoubleOnceNextControllerAction(_buildViewer()),
|
||||||
|
_buildBar(Container()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
case FullScreenAction.THREE_AREA:
|
||||||
|
return Stack(
|
||||||
|
children: [
|
||||||
|
_buildViewer(),
|
||||||
|
_buildBar(_buildThreeAreaControllerAction()),
|
||||||
],
|
],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildBar() {
|
Widget _buildBar(Widget child) {
|
||||||
switch (widget.readerSliderPosition) {
|
switch (widget.readerSliderPosition) {
|
||||||
case ReaderSliderPosition.BOTTOM:
|
case ReaderSliderPosition.BOTTOM:
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
_buildAppBar(),
|
_buildAppBar(),
|
||||||
Expanded(child: _buildController()),
|
Expanded(child: child),
|
||||||
widget.struct.fullScreen
|
widget.struct.fullScreen
|
||||||
? Container()
|
? Container()
|
||||||
: Container(
|
: Container(
|
||||||
|
@ -347,7 +379,7 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
_buildController(),
|
child,
|
||||||
_buildSliderRight(),
|
_buildSliderRight(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -361,7 +393,7 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Stack(
|
child: Stack(
|
||||||
children: [
|
children: [
|
||||||
_buildController(),
|
child,
|
||||||
_buildSliderLeft(),
|
_buildSliderLeft(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
@ -501,24 +533,7 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildController() {
|
Widget _buildFullScreenControllerStackItem() {
|
||||||
switch (currentFullScreenAction()) {
|
|
||||||
case FullScreenAction.CONTROLLER:
|
|
||||||
return _buildFullScreenController();
|
|
||||||
case FullScreenAction.TOUCH_ONCE:
|
|
||||||
return _buildTouchOnceController();
|
|
||||||
case FullScreenAction.TOUCH_DOUBLE:
|
|
||||||
return _buildTouchDoubleController();
|
|
||||||
case FullScreenAction.TOUCH_DOUBLE_ONCE_NEXT:
|
|
||||||
return _buildTouchDoubleOnceNextController();
|
|
||||||
case FullScreenAction.THREE_AREA:
|
|
||||||
return _buildThreeAreaController();
|
|
||||||
default:
|
|
||||||
return Container();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Widget _buildFullScreenController() {
|
|
||||||
if (widget.readerSliderPosition == ReaderSliderPosition.BOTTOM &&
|
if (widget.readerSliderPosition == ReaderSliderPosition.BOTTOM &&
|
||||||
!widget.struct.fullScreen) {
|
!widget.struct.fullScreen) {
|
||||||
return Container();
|
return Container();
|
||||||
|
@ -555,27 +570,27 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildTouchOnceController() {
|
Widget _buildTouchOnceControllerAction(Widget child) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
widget.struct.onFullScreenChange(!widget.struct.fullScreen);
|
widget.struct.onFullScreenChange(!widget.struct.fullScreen);
|
||||||
},
|
},
|
||||||
child: Container(),
|
child: child,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildTouchDoubleController() {
|
Widget _buildTouchDoubleControllerAction(Widget child) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
onDoubleTap: () {
|
onDoubleTap: () {
|
||||||
widget.struct.onFullScreenChange(!widget.struct.fullScreen);
|
widget.struct.onFullScreenChange(!widget.struct.fullScreen);
|
||||||
},
|
},
|
||||||
child: Container(),
|
child: child,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildTouchDoubleOnceNextController() {
|
Widget _buildTouchDoubleOnceNextControllerAction(Widget child) {
|
||||||
return GestureDetector(
|
return GestureDetector(
|
||||||
behavior: HitTestBehavior.translucent,
|
behavior: HitTestBehavior.translucent,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
@ -584,11 +599,11 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
onDoubleTap: () {
|
onDoubleTap: () {
|
||||||
widget.struct.onFullScreenChange(!widget.struct.fullScreen);
|
widget.struct.onFullScreenChange(!widget.struct.fullScreen);
|
||||||
},
|
},
|
||||||
child: Container(),
|
child: child,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildThreeAreaController() {
|
Widget _buildThreeAreaControllerAction() {
|
||||||
return LayoutBuilder(
|
return LayoutBuilder(
|
||||||
builder: (BuildContext context, BoxConstraints constraints) {
|
builder: (BuildContext context, BoxConstraints constraints) {
|
||||||
var up = Expanded(
|
var up = Expanded(
|
||||||
|
@ -703,11 +718,11 @@ abstract class _ImageReaderContentState extends State<_ImageReaderContent> {
|
||||||
case FullScreenAction.CONTROLLER:
|
case FullScreenAction.CONTROLLER:
|
||||||
return false;
|
return false;
|
||||||
case FullScreenAction.TOUCH_ONCE:
|
case FullScreenAction.TOUCH_ONCE:
|
||||||
return true;
|
return false;
|
||||||
case FullScreenAction.TOUCH_DOUBLE:
|
case FullScreenAction.TOUCH_DOUBLE:
|
||||||
return true;
|
return false;
|
||||||
case FullScreenAction.TOUCH_DOUBLE_ONCE_NEXT:
|
case FullScreenAction.TOUCH_DOUBLE_ONCE_NEXT:
|
||||||
return true;
|
return false;
|
||||||
case FullScreenAction.THREE_AREA:
|
case FullScreenAction.THREE_AREA:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -735,7 +750,7 @@ class _EpChooser extends StatefulWidget {
|
||||||
final int epOrder;
|
final int epOrder;
|
||||||
final FutureOr Function(int) onChangeEp;
|
final FutureOr Function(int) onChangeEp;
|
||||||
|
|
||||||
const _EpChooser(this.epNameMap, this.epOrder, this.onChangeEp);
|
_EpChooser(this.epNameMap, this.epOrder, this.onChangeEp);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() => _EpChooserState();
|
State<StatefulWidget> createState() => _EpChooserState();
|
||||||
|
@ -782,7 +797,7 @@ class _SettingPanel extends StatefulWidget {
|
||||||
final FutureOr Function() onReloadEp;
|
final FutureOr Function() onReloadEp;
|
||||||
final FutureOr Function() onDownload;
|
final FutureOr Function() onDownload;
|
||||||
|
|
||||||
const _SettingPanel(this.onReloadEp, this.onDownload);
|
_SettingPanel(this.onReloadEp, this.onDownload);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() => _SettingPanelState();
|
State<StatefulWidget> createState() => _SettingPanelState();
|
||||||
|
@ -953,7 +968,7 @@ class _WebToonReaderState extends _ImageReaderContentState {
|
||||||
}
|
}
|
||||||
_controllerTime = DateTime.now().millisecondsSinceEpoch + 400;
|
_controllerTime = DateTime.now().millisecondsSinceEpoch + 400;
|
||||||
_itemScrollController.scrollTo(
|
_itemScrollController.scrollTo(
|
||||||
index: index, // 减1 当前position 再减少1 前一个
|
index: index,
|
||||||
duration: const Duration(milliseconds: 400),
|
duration: const Duration(milliseconds: 400),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1104,7 +1119,7 @@ class _WebToonDownloadImage extends _WebToonReaderImage {
|
||||||
final int height;
|
final int height;
|
||||||
final String format;
|
final String format;
|
||||||
|
|
||||||
const _WebToonDownloadImage({
|
_WebToonDownloadImage({
|
||||||
required this.fileServer,
|
required this.fileServer,
|
||||||
required this.path,
|
required this.path,
|
||||||
required this.localPath,
|
required this.localPath,
|
||||||
|
@ -1137,7 +1152,7 @@ class _WebToonRemoteImage extends _WebToonReaderImage {
|
||||||
final String fileServer;
|
final String fileServer;
|
||||||
final String path;
|
final String path;
|
||||||
|
|
||||||
const _WebToonRemoteImage(
|
_WebToonRemoteImage(
|
||||||
this.fileServer,
|
this.fileServer,
|
||||||
this.path,
|
this.path,
|
||||||
Size size,
|
Size size,
|
||||||
|
@ -1155,7 +1170,7 @@ abstract class _WebToonReaderImage extends StatefulWidget {
|
||||||
final Size size;
|
final Size size;
|
||||||
final Function(Size)? onTrueSize;
|
final Function(Size)? onTrueSize;
|
||||||
|
|
||||||
const _WebToonReaderImage(this.size, this.onTrueSize);
|
_WebToonReaderImage(this.size, this.onTrueSize);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<StatefulWidget> createState() => _WebToonReaderImageState();
|
State<StatefulWidget> createState() => _WebToonReaderImageState();
|
||||||
|
|
|
@ -15,7 +15,7 @@ EXTERNAL SOURCES:
|
||||||
|
|
||||||
SPEC CHECKSUMS:
|
SPEC CHECKSUMS:
|
||||||
FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424
|
FlutterMacOS: 57701585bf7de1b3fc2bb61f6378d73bbdea8424
|
||||||
url_launcher_macos: 45af3d61de06997666568a7149c1be98b41c95d4
|
url_launcher_macos: 597e05b8e514239626bcf4a850fcf9ef5c856ec3
|
||||||
|
|
||||||
PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c
|
PODFILE CHECKSUM: 6eac6b3292e5142cfc23bdeb71848a40ec51c14c
|
||||||
|
|
||||||
|
|
17
pubspec.lock
17
pubspec.lock
|
@ -84,7 +84,7 @@ packages:
|
||||||
name: crypto
|
name: crypto
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.1"
|
version: "3.0.2"
|
||||||
cupertino_icons:
|
cupertino_icons:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -120,13 +120,6 @@ packages:
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "4.5.1"
|
version: "4.5.1"
|
||||||
filesystem_picker:
|
|
||||||
dependency: "direct main"
|
|
||||||
description:
|
|
||||||
name: filesystem_picker
|
|
||||||
url: "https://pub.dartlang.org"
|
|
||||||
source: hosted
|
|
||||||
version: "2.0.0"
|
|
||||||
flutter:
|
flutter:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description: flutter
|
description: flutter
|
||||||
|
@ -244,7 +237,7 @@ packages:
|
||||||
name: image_picker_ios
|
name: image_picker_ios
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.8.4+11"
|
version: "0.8.5"
|
||||||
image_picker_platform_interface:
|
image_picker_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -445,14 +438,14 @@ packages:
|
||||||
name: url_launcher
|
name: url_launcher
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.20"
|
version: "6.1.0"
|
||||||
url_launcher_android:
|
url_launcher_android:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.15"
|
version: "6.0.16"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -508,7 +501,7 @@ packages:
|
||||||
name: win32
|
name: win32
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.5.1"
|
version: "2.5.2"
|
||||||
xml:
|
xml:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -36,7 +36,6 @@ dependencies:
|
||||||
another_xlider: ^1.0.0
|
another_xlider: ^1.0.0
|
||||||
scrollable_positioned_list: ^0.2.0-nullsafety.0
|
scrollable_positioned_list: ^0.2.0-nullsafety.0
|
||||||
permission_handler: ^8.1.4+1
|
permission_handler: ^8.1.4+1
|
||||||
filesystem_picker: ^2.0.0-nullsafety.0
|
|
||||||
url_launcher: ^6.0.9
|
url_launcher: ^6.0.9
|
||||||
clipboard: ^0.1.3
|
clipboard: ^0.1.3
|
||||||
photo_view: ^0.13.0
|
photo_view: ^0.13.0
|
||||||
|
|
Loading…
Reference in New Issue