✨ Downloads web reader
This commit is contained in:
parent
b0faaecbbd
commit
73b2ded22a
|
@ -1,6 +1,8 @@
|
||||||
v1.6.8
|
v1.6.8
|
||||||
|
|
||||||
- [x] ✨选择API分流以及图片分流时进行测速
|
- [x] ✨选择API分流以及图片分流时进行测速
|
||||||
|
- [x] ✨启用Web服务器, 在局域网内使用浏览器观看已下载的漫画
|
||||||
|
- [x] ✨导入其他软件的历史记录
|
||||||
- [x] ♻️优化安卓文件关联
|
- [x] ♻️优化安卓文件关联
|
||||||
- [x] ♻️优化安卓URL匹配
|
- [x] ♻️优化安卓URL匹配
|
||||||
- [x] 🐛修复切换全屏时的屏幕抖动
|
- [x] 🐛修复切换全屏时的屏幕抖动
|
||||||
|
|
|
@ -95,14 +95,14 @@ SPEC CHECKSUMS:
|
||||||
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
|
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
|
||||||
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
|
||||||
image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98
|
image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98
|
||||||
image_picker_ios: b786a5dcf033a8336a657191401bfdf12017dabb
|
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
|
||||||
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
permission_handler_apple: 44366e37eaf29454a1e7b1b7d736c2cceaeb17ce
|
||||||
SDWebImage: e5cc87bf736e60f49592f307bdf9e157189298a3
|
SDWebImage: e5cc87bf736e60f49592f307bdf9e157189298a3
|
||||||
SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780
|
SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780
|
||||||
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
|
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
|
||||||
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
|
uni_links: d97da20c7701486ba192624d99bffaaffcfc298a
|
||||||
uri_to_file: c4726881848febf4806f0a5707bd12903e02b0f0
|
uri_to_file: c4726881848febf4806f0a5707bd12903e02b0f0
|
||||||
url_launcher_ios: ae1517e5e344f5544fb090b079e11f399dfbe4d2
|
url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
|
||||||
|
|
||||||
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
|
PODFILE CHECKSUM: ef19549a9bc3046e7bb7d2fab4d021637c0c58a3
|
||||||
|
|
||||||
|
|
|
@ -985,4 +985,12 @@ class Method {
|
||||||
Future importComicViewFormOff(String dbPath) {
|
Future importComicViewFormOff(String dbPath) {
|
||||||
return _flatInvoke("importComicViewFormOff", dbPath);
|
return _flatInvoke("importComicViewFormOff", dbPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future startWebServer() {
|
||||||
|
return _flatInvoke("startWebServer", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
Future stopWebServer() {
|
||||||
|
return _flatInvoke("stopWebServer", "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ import 'CleanScreen.dart';
|
||||||
import 'MigrateScreen.dart';
|
import 'MigrateScreen.dart';
|
||||||
import 'ModifyPasswordScreen.dart';
|
import 'ModifyPasswordScreen.dart';
|
||||||
import 'ThemeScreen.dart';
|
import 'ThemeScreen.dart';
|
||||||
|
import 'WebServerScreen.dart';
|
||||||
|
|
||||||
class SettingsScreen extends StatefulWidget {
|
class SettingsScreen extends StatefulWidget {
|
||||||
final bool hiddenAccountInfo;
|
final bool hiddenAccountInfo;
|
||||||
|
@ -165,6 +166,20 @@ class _SettingsScreenState extends State<SettingsScreen> {
|
||||||
subtitle: Text("下载&缓存"),
|
subtitle: Text("下载&缓存"),
|
||||||
),
|
),
|
||||||
const Divider(),
|
const Divider(),
|
||||||
|
ListTile(
|
||||||
|
title: const Text("启动Web服务器"),
|
||||||
|
subtitle: const Text("让局域网内的设备通过浏览器看下载的漫画"),
|
||||||
|
onTap: (){
|
||||||
|
Navigator.of(context).push(
|
||||||
|
mixRoute(
|
||||||
|
builder: (BuildContext context) =>
|
||||||
|
const WebServerScreen(),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const Divider(),
|
||||||
autoCleanSecSetting(),
|
autoCleanSecSetting(),
|
||||||
ListTile(
|
ListTile(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
import '../basic/Method.dart';
|
||||||
|
import 'components/ContentError.dart';
|
||||||
|
import 'components/ContentLoading.dart';
|
||||||
|
import 'components/RightClickPop.dart';
|
||||||
|
|
||||||
|
class WebServerScreen extends StatefulWidget {
|
||||||
|
const WebServerScreen({Key? key}) : super(key: key);
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _WebServerScreenState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _WebServerScreenState extends State<WebServerScreen> {
|
||||||
|
late final Future<String> _ipFuture = method.clientIpSet();
|
||||||
|
late Future _future = method.startWebServer();
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
method.stopWebServer();
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return rightClickPop(
|
||||||
|
child: buildScreen(context),
|
||||||
|
context: context,
|
||||||
|
canPop: true,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget buildScreen(BuildContext context) {
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: const Text("下载 - Web服务器"),
|
||||||
|
),
|
||||||
|
body: FutureBuilder(
|
||||||
|
future: _future,
|
||||||
|
builder: (BuildContext context, AsyncSnapshot snapshot) {
|
||||||
|
if (snapshot.hasError) {
|
||||||
|
return ContentError(
|
||||||
|
error: snapshot.error,
|
||||||
|
stackTrace: snapshot.stackTrace,
|
||||||
|
onRefresh: () async {
|
||||||
|
setState(() {
|
||||||
|
_future = method.startWebServer();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (snapshot.connectionState != ConnectionState.done) {
|
||||||
|
return const ContentLoading(label: '加载中');
|
||||||
|
}
|
||||||
|
return ListView(
|
||||||
|
children: [
|
||||||
|
Container(
|
||||||
|
padding: const EdgeInsets.all(8),
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
FutureBuilder(
|
||||||
|
future: _ipFuture,
|
||||||
|
builder: (BuildContext context,
|
||||||
|
AsyncSnapshot<String> snapshot) {
|
||||||
|
if (snapshot.hasError) {
|
||||||
|
return const Text('获取IP失败');
|
||||||
|
}
|
||||||
|
if (snapshot.connectionState != ConnectionState.done) {
|
||||||
|
return const Text('正在获取IP');
|
||||||
|
}
|
||||||
|
return Text('${snapshot.data}');
|
||||||
|
},
|
||||||
|
),
|
||||||
|
const Text('端口号:8080'),
|
||||||
|
const Text(''),
|
||||||
|
const Text('在浏览器中输入"http://本设备ip:8080/"访问下载的漫画'),
|
||||||
|
const Text(''),
|
||||||
|
const Text('离开页面后服务器将关闭'),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
16
pubspec.lock
16
pubspec.lock
|
@ -257,10 +257,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: image_picker_android
|
name: image_picker_android
|
||||||
sha256: b81db5f5ed8a69d54d5f0932c2af8120e8c0518a037d8beee494eec671da4d4c
|
sha256: dfb5b0f28b8786fcc662b7ed42bfb4b82a6cbbd74da1958384b10d40bdf212a7
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.8.6+5"
|
version: "0.8.6+6"
|
||||||
image_picker_for_web:
|
image_picker_for_web:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -401,10 +401,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: permission_handler_apple
|
name: permission_handler_apple
|
||||||
sha256: "9c370ef6a18b1c4b2f7f35944d644a56aa23576f23abee654cf73968de93f163"
|
sha256: ee96ac32f5a8e6f80756e25b25b9f8e535816c8e6665a96b6d70681f8c4f7e85
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "9.0.7"
|
version: "9.0.8"
|
||||||
permission_handler_platform_interface:
|
permission_handler_platform_interface:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
@ -449,10 +449,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: pointycastle
|
name: pointycastle
|
||||||
sha256: "57b6b78df14175658f09c5dfcfc51a46ad9561a3504fe679913dab404d0cc0f2"
|
sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.7.0"
|
version: "3.7.2"
|
||||||
scrollable_positioned_list:
|
scrollable_positioned_list:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
|
@ -566,10 +566,10 @@ packages:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
name: url_launcher_android
|
name: url_launcher_android
|
||||||
sha256: "845530e5e05db5500c1a4c1446785d60cbd8f9bd45e21e7dd643a3273bb4bbd1"
|
sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8
|
||||||
url: "https://pub.dev"
|
url: "https://pub.dev"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "6.0.25"
|
version: "6.0.26"
|
||||||
url_launcher_ios:
|
url_launcher_ios:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
|
|
|
@ -15,7 +15,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
||||||
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
|
||||||
# Read more about iOS versioning at
|
# Read more about iOS versioning at
|
||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
version: 1.6.7+14
|
version: 1.6.8+15
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.12.0 <3.0.0"
|
sdk: ">=2.12.0 <3.0.0"
|
||||||
|
|
Loading…
Reference in New Issue