opt: pages

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2024-12-15 23:26:27 +08:00
parent 5a69e6abb0
commit 3852e21571
13 changed files with 234 additions and 278 deletions

View File

@@ -127,6 +127,9 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
if (Platform.isIOS || Platform.isAndroid) { if (Platform.isIOS || Platform.isAndroid) {
StatusBarControl.setHidden(false, animation: StatusBarAnimation.FADE); StatusBarControl.setHidden(false, animation: StatusBarAnimation.FADE);
} }
for (int index = 0; index < widget.sources.length; index++) {
CachedNetworkImageProvider(_getActualUrl(index)).evict();
}
super.dispose(); super.dispose();
} }
@@ -206,6 +209,10 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
} }
} }
String _getActualUrl(int index) => _thumbList[index] && _quality != 100
? '${widget.sources[index]}@${_quality}q.webp'
: widget.sources[index];
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Stack( return Stack(
@@ -252,7 +259,7 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
index == currentIndex, index == currentIndex,
_enablePageView, _enablePageView,
) )
: _itemBuilder(widget.sources, index), : _itemBuilder(index),
); );
}, },
), ),
@@ -358,17 +365,15 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
Share.shareXFiles([XFile(path)], subject: imgUrl); Share.shareXFiles([XFile(path)], subject: imgUrl);
} }
Widget _itemBuilder(sources, index) { Widget _itemBuilder(index) {
return Center( return Center(
child: Hero( child: Hero(
tag: sources[index], tag: widget.sources[index],
child: CachedNetworkImage( child: CachedNetworkImage(
fadeInDuration: const Duration(milliseconds: 0), fadeInDuration: const Duration(milliseconds: 0),
fadeOutDuration: const Duration(milliseconds: 0), fadeOutDuration: const Duration(milliseconds: 0),
imageUrl: _thumbList[index] && _quality != 100 imageUrl: _getActualUrl(index),
? '${sources[index]}@${_quality}q.webp' // fit: BoxFit.contain,
: sources[index],
fit: BoxFit.contain,
progressIndicatorBuilder: (context, url, progress) { progressIndicatorBuilder: (context, url, progress) {
return Center( return Center(
child: SizedBox( child: SizedBox(
@@ -377,13 +382,13 @@ class _InteractiveviewerGalleryState extends State<InteractiveviewerGallery>
), ),
); );
}, },
errorListener: (value) { // errorListener: (value) {
WidgetsBinding.instance.addPostFrameCallback((_) { // WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() { // setState(() {
_thumbList[index] = false; // _thumbList[index] = false;
}); // });
}); // });
}, // },
), ),
), ),
); );

View File

@@ -88,12 +88,12 @@ class NetworkImgLayer extends StatelessWidget {
placeholder: (BuildContext context, String url) => placeholder: (BuildContext context, String url) =>
placeholder(context), placeholder(context),
imageBuilder: imageBuilder, imageBuilder: imageBuilder,
errorListener: (value) { // errorListener: (value) {
thumbnail = false; // thumbnail = false;
if (context.mounted) { // if (context.mounted) {
(context as Element).markNeedsBuild(); // (context as Element).markNeedsBuild();
} // }
}, // },
), ),
), ),
) )

View File

@@ -4,18 +4,12 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:PiliPalaX/http/index.dart';
import 'package:PiliPalaX/models/github/latest.dart'; import 'package:PiliPalaX/models/github/latest.dart';
import 'package:PiliPalaX/pages/setting/controller.dart'; import 'package:PiliPalaX/pages/setting/controller.dart';
import 'package:PiliPalaX/utils/storage.dart'; import 'package:PiliPalaX/utils/storage.dart';
import 'package:PiliPalaX/utils/utils.dart'; import 'package:PiliPalaX/utils/utils.dart';
import 'package:url_launcher/url_launcher.dart';
import '../../utils/cache_manage.dart'; import '../../utils/cache_manage.dart';
const String _sourceCodeUrl = 'https://github.com/bggRGjQaUbCoE/PiliPalaX';
const String _originSourceCodeUrl = 'https://github.com/guozhigq/pilipala';
const String _upstreamUrl = 'https://github.com/orz12/PiliPalaX';
class AboutPage extends StatefulWidget { class AboutPage extends StatefulWidget {
const AboutPage({super.key}); const AboutPage({super.key});
@@ -25,6 +19,11 @@ class AboutPage extends StatefulWidget {
class _AboutPageState extends State<AboutPage> { class _AboutPageState extends State<AboutPage> {
final AboutController _aboutController = Get.put(AboutController()); final AboutController _aboutController = Get.put(AboutController());
static const String _sourceCodeUrl =
'https://github.com/bggRGjQaUbCoE/PiliPalaX';
static const String _originSourceCodeUrl =
'https://github.com/guozhigq/pilipala';
static const String _upstreamUrl = 'https://github.com/orz12/PiliPalaX';
@override @override
void initState() { void initState() {
@@ -115,13 +114,13 @@ class _AboutPageState extends State<AboutPage> {
color: Theme.of(context).colorScheme.outlineVariant, color: Theme.of(context).colorScheme.outlineVariant,
), ),
ListTile( ListTile(
onTap: () => _aboutController.githubUrl(_sourceCodeUrl), onTap: () => Utils.launchURL(_sourceCodeUrl),
leading: const Icon(Icons.code), leading: const Icon(Icons.code),
title: const Text('Source Code'), title: const Text('Source Code'),
subtitle: Text(_sourceCodeUrl, style: subTitleStyle), subtitle: Text(_sourceCodeUrl, style: subTitleStyle),
), ),
ListTile( ListTile(
onTap: () => _aboutController.githubUrl(_originSourceCodeUrl), onTap: () => Utils.launchURL(_originSourceCodeUrl),
leading: const Icon(Icons.code), leading: const Icon(Icons.code),
title: const Text('Origin'), title: const Text('Origin'),
subtitle: Text( subtitle: Text(
@@ -130,7 +129,7 @@ class _AboutPageState extends State<AboutPage> {
), ),
), ),
ListTile( ListTile(
onTap: () => _aboutController.githubUrl(_upstreamUrl), onTap: () => Utils.launchURL(_upstreamUrl),
leading: const Icon(Icons.code), leading: const Icon(Icons.code),
title: const Text('Upstream'), title: const Text('Upstream'),
subtitle: Text( subtitle: Text(
@@ -139,7 +138,23 @@ class _AboutPageState extends State<AboutPage> {
), ),
), ),
ListTile( ListTile(
onTap: () => _aboutController.feedback(context), onTap: () {
showDialog(
context: context,
builder: (context) {
return SimpleDialog(
clipBehavior: Clip.hardEdge,
title: const Text('问题反馈'),
children: [
ListTile(
title: const Text('GitHub Issue'),
onTap: () => Utils.launchURL('$_sourceCodeUrl/issues'),
),
],
);
},
);
},
leading: const Icon(Icons.feedback_outlined), leading: const Icon(Icons.feedback_outlined),
title: const Text('问题反馈'), title: const Text('问题反馈'),
trailing: Icon( trailing: Icon(
@@ -149,7 +164,9 @@ class _AboutPageState extends State<AboutPage> {
), ),
), ),
ListTile( ListTile(
onTap: () => _aboutController.logs(), onTap: () {
Get.toNamed('/logs');
},
leading: const Icon(Icons.bug_report_outlined), leading: const Icon(Icons.bug_report_outlined),
title: const Text('错误日志'), title: const Text('错误日志'),
trailing: Icon(Icons.arrow_forward, size: 16, color: outline), trailing: Icon(Icons.arrow_forward, size: 16, color: outline),
@@ -257,22 +274,26 @@ class _AboutPageState extends State<AboutPage> {
child: const Text('取消'), child: const Text('取消'),
), ),
TextButton( TextButton(
onPressed: () { onPressed: () async {
Get.back(); Get.back();
GStorage.setting.clear(); await Future.wait([
GStorage.video.clear(); GStorage.setting.clear(),
GStorage.video.clear(),
]);
SmartDialog.showToast('重置成功'); SmartDialog.showToast('重置成功');
}, },
child: const Text('重置可导出的设置'), child: const Text('重置可导出的设置'),
), ),
TextButton( TextButton(
onPressed: () { onPressed: () async {
Get.back(); Get.back();
GStorage.userInfo.clear(); await Future.wait([
GStorage.setting.clear(); GStorage.userInfo.clear(),
GStorage.localCache.clear(); GStorage.setting.clear(),
GStorage.video.clear(); GStorage.localCache.clear(),
GStorage.historyWord.clear(); GStorage.video.clear(),
GStorage.historyWord.clear(),
]);
SmartDialog.showToast('重置成功'); SmartDialog.showToast('重置成功');
}, },
child: const Text('重置所有数据(含登录信息)'), child: const Text('重置所有数据(含登录信息)'),
@@ -298,7 +319,6 @@ class AboutController extends GetxController {
RxBool isUpdate = true.obs; RxBool isUpdate = true.obs;
RxBool isLoading = true.obs; RxBool isLoading = true.obs;
LatestDataModel? data; LatestDataModel? data;
// RxInt count = 0.obs;
RxString cacheSize = ''.obs; RxString cacheSize = ''.obs;
@override @override
@@ -330,91 +350,21 @@ class AboutController extends GetxController {
currentVersion.value = "${currentInfo.version}+$buildNumber"; currentVersion.value = "${currentInfo.version}+$buildNumber";
} }
// 获取远程版本 // // 获取远程版本
Future getRemoteApp() async { // Future getRemoteApp() async {
var result = await Request().get(Api.latestApp, extra: {'ua': 'pc'}); // var result = await Request().get(Api.latestApp, extra: {'ua': 'pc'});
if (result.data.isEmpty) { // if (result.data.isEmpty) {
SmartDialog.showToast('检查更新失败github接口未返回数据请检查网络'); // SmartDialog.showToast('检查更新失败github接口未返回数据请检查网络');
return false; // return false;
} else if (result.data[0] == null) { // } else if (result.data[0] == null) {
SmartDialog.showToast('检查更新失败github接口返回如下内容\n${result.data}'); // SmartDialog.showToast('检查更新失败github接口返回如下内容\n${result.data}');
return false; // return false;
}
data = LatestDataModel.fromJson(result.data[0]);
remoteAppInfo = data;
remoteVersion.value = data!.tagName!;
isUpdate.value =
Utils.needUpdate(currentVersion.value, remoteVersion.value);
isLoading.value = false;
}
// 跳转下载/本地更新
Future onUpdate() async {
if (data != null) {
Utils.matchVersion(data);
}
}
// 跳转github
githubUrl(String url) {
launchUrl(
Uri.parse(url),
mode: LaunchMode.externalApplication,
);
}
githubRelease() {
launchUrl(
Uri.parse('$_sourceCodeUrl/release'),
mode: LaunchMode.externalApplication,
);
}
// 问题反馈
feedback(BuildContext context) async {
await showDialog(
context: context,
builder: (context) {
return SimpleDialog(
clipBehavior: Clip.hardEdge,
title: const Text('问题反馈'),
children: [
ListTile(
title: const Text('GitHub Issue'),
onTap: () => launchUrl(
Uri.parse('$_sourceCodeUrl/issues'),
// 系统自带浏览器打开
mode: LaunchMode.externalApplication,
),
),
// ListTile(
// title: const Text('腾讯兔小巢'),
// onTap: () => launchUrl(
// Uri.parse('https://support.qq.com/embed/phone/637735'),
// // 系统自带浏览器打开
// mode: LaunchMode.externalApplication,
// ),
// ),
],
);
},
);
}
// 日志
logs() {
Get.toNamed('/logs');
}
// tapOnVersion() {
// if (settingController.hiddenSettingUnlocked.value) {
// SmartDialog.showToast('您已解锁开发人员选项, 无需再次操作');
// return;
// }
// count.value++;
// if (count.value == 5) {
// setting.put(SettingBoxKey.hiddenSettingUnlocked, true);
// SmartDialog.showToast('恭喜您发现了开发人员选项!');
// } // }
// data = LatestDataModel.fromJson(result.data[0]);
// remoteAppInfo = data;
// remoteVersion.value = data!.tagName!;
// isUpdate.value =
// Utils.needUpdate(currentVersion.value, remoteVersion.value);
// isLoading.value = false;
// } // }
} }

View File

@@ -126,7 +126,6 @@ abstract class ReplyController extends CommonController {
sortType = ReplySortType.time; sortType = ReplySortType.time;
mode = Mode.MAIN_LIST_TIME; mode = Mode.MAIN_LIST_TIME;
break; break;
default:
} }
sortTypeTitle.value = sortType.titles; sortTypeTitle.value = sortType.titles;
sortTypeLabel.value = sortType.labels; sortTypeLabel.value = sortType.labels;

View File

@@ -225,28 +225,28 @@ class _UpPanelState extends State<UpPanel> {
} }
} }
class _SliverHeaderDelegate extends SliverPersistentHeaderDelegate { // class _SliverHeaderDelegate extends SliverPersistentHeaderDelegate {
_SliverHeaderDelegate({required this.height, required this.child}); // _SliverHeaderDelegate({required this.height, required this.child});
final double height; // final double height;
final Widget child; // final Widget child;
@override // @override
Widget build( // Widget build(
BuildContext context, double shrinkOffset, bool overlapsContent) { // BuildContext context, double shrinkOffset, bool overlapsContent) {
return child; // return child;
} // }
@override // @override
double get maxExtent => height; // double get maxExtent => height;
@override // @override
double get minExtent => height; // double get minExtent => height;
@override // @override
bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) => // bool shouldRebuild(covariant SliverPersistentHeaderDelegate oldDelegate) =>
true; // true;
} // }
class UpPanelSkeleton extends StatelessWidget { class UpPanelSkeleton extends StatelessWidget {
const UpPanelSkeleton({super.key}); const UpPanelSkeleton({super.key});

View File

@@ -111,21 +111,21 @@ class _FollowPageState extends State<FollowPage> {
} }
} }
class _FakeAPI { // class _FakeAPI {
static const List<String> _kOptions = <String>[ // static const List<String> _kOptions = <String>[
'aardvark', // 'aardvark',
'bobcat', // 'bobcat',
'chameleon', // 'chameleon',
]; // ];
// Searches the options, but injects a fake "network" delay. // // Searches the options, but injects a fake "network" delay.
static Future<Iterable<String>> search(String query) async { // static Future<Iterable<String>> search(String query) async {
await Future<void>.delayed( // await Future<void>.delayed(
const Duration(seconds: 1)); // Fake 1 second delay. // const Duration(seconds: 1)); // Fake 1 second delay.
if (query == '') { // if (query == '') {
return const Iterable<String>.empty(); // return const Iterable<String>.empty();
} // }
return _kOptions.where((String option) { // return _kOptions.where((String option) {
return option.contains(query.toLowerCase()); // return option.contains(query.toLowerCase());
}); // });
} // }
} // }

View File

@@ -120,12 +120,15 @@ class _LoginPageState extends State<LoginPage> {
child: Padding( child: Padding(
padding: padding:
const EdgeInsets.symmetric(horizontal: 20, vertical: 20), const EdgeInsets.symmetric(horizontal: 20, vertical: 20),
child: Text(_loginPageCtr.codeInfo.value['data']?['url'] ?? "", child: Text(
style: Theme.of(context).textTheme.labelSmall!.copyWith( _loginPageCtr.codeInfo.value['data']?['url'] ?? "",
style: Theme.of(context).textTheme.labelSmall!.copyWith(
color: Theme.of(context) color: Theme.of(context)
.colorScheme .colorScheme
.onSurface .onSurface
.withOpacity(0.4))), .withOpacity(0.4),
),
),
), ),
)), )),
Padding( Padding(

View File

@@ -1527,37 +1527,37 @@ class VideoDetailController extends GetxController
}, },
); );
List<SegmentType> _actionType2SegmentType(ActionType actionType) { // List<SegmentType> _actionType2SegmentType(ActionType actionType) {
return switch (actionType) { // return switch (actionType) {
ActionType.skip => [ // ActionType.skip => [
SegmentType.sponsor, // SegmentType.sponsor,
SegmentType.selfpromo, // SegmentType.selfpromo,
SegmentType.interaction, // SegmentType.interaction,
SegmentType.intro, // SegmentType.intro,
SegmentType.outro, // SegmentType.outro,
SegmentType.preview, // SegmentType.preview,
SegmentType.filler, // SegmentType.filler,
], // ],
ActionType.mute => [ // ActionType.mute => [
SegmentType.sponsor, // SegmentType.sponsor,
SegmentType.selfpromo, // SegmentType.selfpromo,
SegmentType.interaction, // SegmentType.interaction,
SegmentType.intro, // SegmentType.intro,
SegmentType.outro, // SegmentType.outro,
SegmentType.preview, // SegmentType.preview,
SegmentType.music_offtopic, // SegmentType.music_offtopic,
SegmentType.filler, // SegmentType.filler,
], // ],
ActionType.full => [ // ActionType.full => [
SegmentType.sponsor, // SegmentType.sponsor,
SegmentType.selfpromo, // SegmentType.selfpromo,
SegmentType.exclusive_access, // SegmentType.exclusive_access,
], // ],
ActionType.poi => [ // ActionType.poi => [
SegmentType.poi_highlight, // SegmentType.poi_highlight,
], // ],
}; // };
} // }
List<ActionType> _segmentType2ActionType(SegmentType segmentType) { List<ActionType> _segmentType2ActionType(SegmentType segmentType) {
return switch (segmentType) { return switch (segmentType) {

View File

@@ -191,6 +191,7 @@ class LiveMessageStream {
for (final server in servers) { for (final server in servers) {
try { try {
return await WebSocket.connect(server); return await WebSocket.connect(server);
// ignore: empty_catches
} catch (e) {} } catch (e) {}
} }
throw Exception("all servers connect failed"); throw Exception("all servers connect failed");

View File

@@ -301,20 +301,20 @@ class PiliScheme {
// https | m.bilibili.com | /bangumi/play/ss39708 // https | m.bilibili.com | /bangumi/play/ss39708
// final String scheme = value.scheme!; // final String scheme = value.scheme!;
final String host = value.host; final String host = value.host;
final String? path = value.path; final String path = value.path;
Map<String, String> query = value.queryParameters; Map<String, String> query = value.queryParameters;
RegExp regExp = RegExp(r'^((www\.)|(m\.))?bilibili\.com$'); RegExp regExp = RegExp(r'^((www\.)|(m\.))?bilibili\.com$');
if (regExp.hasMatch(host)) { if (regExp.hasMatch(host)) {
debugPrint('bilibili.com'); debugPrint('bilibili.com');
} else if (host.contains('live')) { } else if (host.contains('live')) {
int roomId = int.parse(path!.split('/').last); int roomId = int.parse(path.split('/').last);
Utils.toDupNamed( Utils.toDupNamed(
'/liveRoom?roomid=$roomId', '/liveRoom?roomid=$roomId',
arguments: {'liveItem': null, 'heroTag': roomId.toString()}, arguments: {'liveItem': null, 'heroTag': roomId.toString()},
); );
return; return;
} else if (host.contains('space')) { } else if (host.contains('space')) {
var mid = path!.split('/').last; var mid = path.split('/').last;
Utils.toDupNamed('/member?mid=$mid', arguments: {'face': ''}); Utils.toDupNamed('/member?mid=$mid', arguments: {'face': ''});
return; return;
} else if (host == 'b23.tv') { } else if (host == 'b23.tv') {
@@ -352,79 +352,77 @@ class PiliScheme {
return; return;
} }
if (path != null) { List<String> pathPart = path.split('/');
List<String> pathPart = path.split('/'); if (pathPart.length < 3) {
if (pathPart.length < 3) { Utils.toDupNamed(
'/webviewnew',
parameters: {'url': value.toString()},
);
return;
}
final String area = pathPart[1] == 'mobile' ? pathPart[2] : pathPart[1];
switch (area) {
case 'bangumi':
debugPrint('番剧');
for (var pathSegment in pathPart) {
if (pathSegment.startsWith('ss')) {
bangumiPush(matchNum(pathSegment).first, null);
break;
} else if (pathSegment.startsWith('ep')) {
bangumiPush(null, matchNum(pathSegment).first);
break;
}
}
break;
case 'video':
debugPrint('投稿');
final Map<String, dynamic> map = IdUtils.matchAvorBv(input: path);
if (map.containsKey('AV')) {
videoPush(map['AV']! as int, null);
} else if (map.containsKey('BV')) {
videoPush(null, map['BV'] as String);
} else {
SmartDialog.showToast('投稿匹配失败');
}
break;
case 'read':
debugPrint('专栏');
late String id;
if (query['id'] != null) {
id = 'cv${matchNum(query['id']!).first}';
} else {
id = 'cv${matchNum(path).firstOrNull}';
}
Utils.toDupNamed('/htmlRender', parameters: {
'url': value.toString(),
'title': '',
'id': id,
'dynamicType': 'read'
});
break;
case 'space':
debugPrint('个人空间');
Utils.toDupNamed( Utils.toDupNamed(
'/webviewnew', '/member?mid=${pathPart[1] == 'mobile' ? pathPart.getOrNull(3) : pathPart.getOrNull(2)}',
parameters: {'url': value.toString()}, arguments: {'face': ''});
); break;
return; default:
} var res = IdUtils.matchAvorBv(input: area.split('?').first);
final String area = pathPart[1] == 'mobile' ? pathPart[2] : pathPart[1]; if (res.containsKey('AV')) {
switch (area) { videoPush(res['AV']! as int, null);
case 'bangumi': } else if (res.containsKey('BV')) {
debugPrint('番剧'); videoPush(null, res['BV'] as String);
for (var pathSegment in pathPart) { } else {
if (pathSegment.startsWith('ss')) { SmartDialog.showToast('未知路径或匹配错误:$value,先采用浏览器打开');
bangumiPush(matchNum(pathSegment).first, null);
break;
} else if (pathSegment.startsWith('ep')) {
bangumiPush(null, matchNum(pathSegment).first);
break;
}
}
break;
case 'video':
debugPrint('投稿');
final Map<String, dynamic> map = IdUtils.matchAvorBv(input: path);
if (map.containsKey('AV')) {
videoPush(map['AV']! as int, null);
} else if (map.containsKey('BV')) {
videoPush(null, map['BV'] as String);
} else {
SmartDialog.showToast('投稿匹配失败');
}
break;
case 'read':
debugPrint('专栏');
late String id;
if (query['id'] != null) {
id = 'cv${matchNum(query['id']!).first}';
} else {
id = 'cv${matchNum(path).firstOrNull}';
}
Utils.toDupNamed('/htmlRender', parameters: {
'url': value.toString(),
'title': '',
'id': id,
'dynamicType': 'read'
});
break;
case 'space':
debugPrint('个人空间');
Utils.toDupNamed( Utils.toDupNamed(
'/member?mid=${pathPart[1] == 'mobile' ? pathPart.getOrNull(3) : pathPart.getOrNull(2)}', '/webviewnew',
arguments: {'face': ''}); parameters: {
break; 'url': value.toString(),
default: 'type': 'url',
var res = IdUtils.matchAvorBv(input: area.split('?').first); 'pageTitle': ''
if (res.containsKey('AV')) { },
videoPush(res['AV']! as int, null); );
} else if (res.containsKey('BV')) { }
videoPush(null, res['BV'] as String);
} else {
SmartDialog.showToast('未知路径或匹配错误:$value,先采用浏览器打开');
Utils.toDupNamed(
'/webviewnew',
parameters: {
'url': value.toString(),
'type': 'url',
'pageTitle': ''
},
);
}
}
} }
} }

View File

@@ -1,5 +1,5 @@
// 订阅者回调签名 // 订阅者回调签名
typedef void EventCallback(arg); typedef EventCallback = void Function(dynamic arg);
class EventBus { class EventBus {
// 私有构造函数 // 私有构造函数

View File

@@ -53,7 +53,7 @@ extension StringExt on String {
String get http2https => replaceFirst(RegExp("^http://"), "https://"); String get http2https => replaceFirst(RegExp("^http://"), "https://");
} }
extension boolExt on bool { extension BoolExt on bool {
bool get not => !this; bool get not => !this;
} }

View File

@@ -106,18 +106,18 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: audio_service name: audio_service
sha256: "9dd5ba7e77567b290c35908b1950d61485b4dfdd3a0ac398e98cfeec04651b75" sha256: f6c8191bef6b843da34675dd0731ad11d06094c36b691ffcf3148a4feb2e585f
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.18.15" version: "0.18.16"
audio_service_platform_interface: audio_service_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: audio_service_platform_interface name: audio_service_platform_interface
sha256: "8431a455dac9916cc9ee6f7da5620a666436345c906ad2ebb7fa41d18b3c1bf4" sha256: "6283782851f6c8b501b60904a32fc7199dc631172da0629d7301e66f672ab777"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.1.1" version: "0.1.3"
audio_service_web: audio_service_web:
dependency: transitive dependency: transitive
description: description:
@@ -914,10 +914,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: image name: image
sha256: "599d08e369969bdf83138f5b4e0a7e823d3f992f23b8a64dd626877c37013533" sha256: "20842a5ad1555be624c314b0c0cc0566e8ece412f61e859a42efeb6d4101a26c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.4.0" version: "4.5.0"
image_cropper: image_cropper:
dependency: "direct main" dependency: "direct main"
description: description: