Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions lib/common/utils/status_bar_tap.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ class StatusBarTapObserver with WidgetsBindingObserver {
/// 当前页面的路由名,用于判断是否在前台。
String? routeName;

/// 当前应用生命周期状态
AppLifecycleState _lifecycleState = AppLifecycleState.resumed;

StatusBarTapObserver register() {
WidgetsBinding.instance.addObserver(this);
return this;
Expand All @@ -33,8 +36,15 @@ class StatusBarTapObserver with WidgetsBindingObserver {
if (!Pref.enableStatusBarTapToTop) return;
if (routeName == null) return;
if (Get.currentRoute != routeName) return;
// 仅在应用处于前台(resumed)时触发
if (_lifecycleState != AppLifecycleState.resumed) return;
if (scrollController.hasClients) {
animateToTop();
}
}

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
_lifecycleState = state;
}
}
3 changes: 2 additions & 1 deletion lib/common/widgets/image/cached_network_svg_image.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

import 'dart:developer';

import 'package:PiliPlus/utils/cache_manager_ext.dart';
import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_svg/flutter_svg.dart';

class CachedNetworkSVGImage extends StatefulWidget {
Expand Down
52 changes: 25 additions & 27 deletions lib/common/widgets/image/network_img_layer.dart
Original file line number Diff line number Diff line change
Expand Up @@ -71,33 +71,31 @@ class NetworkImgLayer extends StatelessWidget {
memCacheHeight = height.cacheSize(context);
}

return RepaintBoundary(
child: CachedNetworkImage(
imageUrl: (isEmote)
? ImageUtils.thumbnailUrl(src, quality)
: ImageUtils.thumbnailUrlWithSize(
src,
memCacheWidth,
memCacheHeight,
quality,
),
width: width,
height: height,
memCacheWidth: memCacheWidth,
memCacheHeight: memCacheHeight,
fit: fit,
alignment: alignment,
fadeOutDuration: fadeOutDuration,
fadeInDuration: fadeInDuration,
filterQuality: FilterQuality.low,
placeholder: (_, _) =>
getPlaceHolder?.call() ??
_placeholder(context, isEmote: isEmote, isAvatar: isAvatar),
errorBuilder: (_, _, _) =>
_placeholder(context, isEmote: isEmote, isAvatar: isAvatar),
colorBlendMode: reduce ? BlendMode.modulate : null,
color: reduce ? reduceLuxColor : null,
),
return CachedNetworkImage(
imageUrl: (isEmote)
? ImageUtils.thumbnailUrl(src, quality)
: ImageUtils.thumbnailUrlWithSize(
src,
memCacheWidth,
memCacheHeight,
quality,
),
width: width,
height: height,
memCacheWidth: memCacheWidth,
memCacheHeight: memCacheHeight,
fit: fit,
alignment: alignment,
fadeOutDuration: fadeOutDuration,
fadeInDuration: fadeInDuration,
filterQuality: FilterQuality.low,
placeholder: (_, _) =>
getPlaceHolder?.call() ??
_placeholder(context, isEmote: isEmote, isAvatar: isAvatar),
errorBuilder: (_, _, _) =>
_placeholder(context, isEmote: isEmote, isAvatar: isAvatar),
colorBlendMode: reduce ? BlendMode.modulate : null,
color: reduce ? reduceLuxColor : null,
);
}

Expand Down
3 changes: 3 additions & 0 deletions lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import 'package:PiliPlus/utils/calc_window_position.dart';
import 'package:PiliPlus/utils/date_utils.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart';
import 'package:PiliPlus/utils/image_memory_cleaner.dart';
import 'package:PiliPlus/utils/json_file_handler.dart';
import 'package:PiliPlus/utils/path_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
Expand Down Expand Up @@ -248,6 +249,8 @@ void main() async {
runApp(const MyApp());
}

ImageMemoryCleaner.instance.register();

if (OS.isHarmony) {
// 本次启动若由跨设备接续拉起,首帧后取回接续数据并跳转视频页;
// 顺带注册 method channel handler,保证热启动接续推送可达
Expand Down
4 changes: 2 additions & 2 deletions lib/pages/common/publish/common_rich_text_pub_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import 'package:PiliPlus/models_new/emote/emote.dart' as e;
import 'package:PiliPlus/models_new/live/live_emote/emoticon.dart';
import 'package:PiliPlus/pages/common/publish/common_publish_page.dart';
import 'package:PiliPlus/pages/dynamics_mention/view.dart';
import 'package:PiliPlus/utils/cache_manager_ext.dart';
import 'package:PiliPlus/utils/extension/file_ext.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/extension/string_ext.dart';
Expand All @@ -22,13 +23,12 @@ import 'package:PiliPlus/utils/feed_back.dart';
import 'package:PiliPlus/utils/image_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:dio/dio.dart' show CancelToken;
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:image_cropper/image_cropper.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/pages/live_room/superchat/superchat_card.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import 'package:PiliPlus/utils/image_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart' hide SelectionArea;
import 'package:get/get.dart';
Expand Down
8 changes: 4 additions & 4 deletions lib/pages/live_room/view.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'dart:io';
import 'dart:async';
import 'dart:io';
import 'dart:math';
import 'dart:ui';

Expand Down Expand Up @@ -171,9 +172,8 @@ class _LiveRoomPageState extends State<LiveRoomPage>
ScreenBrightnessPlatform.instance.resetApplicationScreenBrightness();
}
PlPlayerController.setPlayCallBack(null);
plPlayerController
..removeStatusLister(playerListener)
..dispose();
plPlayerController.removeStatusLister(playerListener);
unawaited(plPlayerController.dispose());
for (final e in LiveContributionRankType.values) {
Get.delete<ContributionRankController>(
tag: '${_liveRoomController.roomId}${e.name}',
Expand Down
12 changes: 12 additions & 0 deletions lib/pages/member/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import 'package:PiliPlus/pages/member_video_web/archive/view.dart';
import 'package:PiliPlus/pages/member_video_web/season_series/view.dart';
import 'package:PiliPlus/utils/date_utils.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
Expand All @@ -52,6 +53,14 @@ class _MemberPageState extends State<MemberPage> with WidgetsBindingObserver {
PageController getHeaderController() =>
_headerController ??= PageController();

/// 当前应用生命周期状态
AppLifecycleState _lifecycleState = AppLifecycleState.resumed;

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
_lifecycleState = state;
}

@override
void initState() {
super.initState();
Expand All @@ -76,7 +85,10 @@ class _MemberPageState extends State<MemberPage> with WidgetsBindingObserver {

@override
void handleStatusBarTap() {
if (!Pref.enableStatusBarTapToTop) return;
if (Get.currentRoute != _routeName) return;
// 仅在应用处于前台(resumed)时触发
if (_lifecycleState != AppLifecycleState.resumed) return;
final outerCtr = _userController.key.currentState?.outerController;
if (outerCtr?.hasClients == true) {
outerCtr!.animateTo(
Expand Down
24 changes: 16 additions & 8 deletions lib/pages/video/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import 'package:PiliPlus/utils/page_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:auto_orientation/auto_orientation.dart';
import 'package:extended_nested_scroll_view/extended_nested_scroll_view.dart';
import 'package:floating/floating.dart';
Expand Down Expand Up @@ -140,6 +141,9 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>

Worker? _pipModeWorker;

/// 当前应用生命周期状态
AppLifecycleState _lifecycleState = AppLifecycleState.resumed;

@override
void initState() {
super.initState();
Expand Down Expand Up @@ -201,6 +205,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>

@override
void didChangeAppLifecycleState(AppLifecycleState state) {
_lifecycleState = state;
late final ctr = videoDetailController.plPlayerController;
if (state == AppLifecycleState.resumed) {
if (!ctr.showDanmaku) {
Expand Down Expand Up @@ -231,7 +236,10 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>

@override
void handleStatusBarTap() {
if (!Pref.enableStatusBarTapToTop) return;
if (!isShowing) return;
// 仅在应用处于前台(resumed)时触发
if (_lifecycleState != AppLifecycleState.resumed) return;
if (videoDetailController.scrollCtr.hasClients) {
videoDetailController.animToTop();
}
Expand Down Expand Up @@ -396,7 +404,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
videoPlayerServiceHandler?.onVideoDetailDispose(heroTag);
if (plPlayerController != null) {
videoDetailController.makeHeartBeat();
plPlayerController!.dispose();
unawaited(plPlayerController!.dispose());
} else {
PlPlayerController.updatePlayCount();
}
Expand Down Expand Up @@ -737,10 +745,10 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
.onSurface,
),
onPressed: () {
videoDetailController
.plPlayerController
..isCloseAll = true
..dispose();
final plCtr = videoDetailController
.plPlayerController;
plCtr.isCloseAll = true;
unawaited(plCtr.dispose());
Get.until(
(route) => route.isFirst,
);
Expand Down Expand Up @@ -1275,9 +1283,9 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
],
),
onPressed: () {
videoDetailController.plPlayerController
..isCloseAll = true
..dispose();
final plCtr = videoDetailController.plPlayerController;
plCtr.isCloseAll = true;
unawaited(plCtr.dispose());
Get.until((route) => route.isFirst);
},
),
Expand Down
6 changes: 3 additions & 3 deletions lib/pages/video/widgets/header_control.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1792,9 +1792,9 @@ class HeaderControlState extends State<HeaderControl>
color: Colors.white,
),
onPressed: () {
videoDetailCtr.plPlayerController
..isCloseAll = true
..dispose();
final plCtr = videoDetailCtr.plPlayerController;
plCtr.isCloseAll = true;
unawaited(plCtr.dispose());
Get.until((route) => route.isFirst);
},
),
Expand Down
12 changes: 6 additions & 6 deletions lib/plugin/pl_player/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,7 @@ class PlPlayerController with BlockConfigMixin {

if (_playerCount == 0) {
_removeListeners();
_videoPlayerController?.dispose();
await _videoPlayerController?.dispose();
_videoPlayerController = null;
_videoController = null;
return;
Expand Down Expand Up @@ -824,7 +824,7 @@ class PlPlayerController with BlockConfigMixin {
player = await _initPlayer();
if (_playerCount == 0) {
_removeListeners();
player.dispose();
await player.dispose();
player = null;
_videoController = null;
return;
Expand Down Expand Up @@ -1768,7 +1768,7 @@ class PlPlayerController with BlockConfigMixin {
}

bool isCloseAll = false;
void dispose() {
Future<void> dispose() async {
// 每次减1,最后销毁
cancelLongPressTimer();
_cancelSubForSeek();
Expand Down Expand Up @@ -1817,17 +1817,17 @@ class PlPlayerController with BlockConfigMixin {
if (kDebugMode) {
debugPrint('dispose player');
}
_videoPlayerController?.dispose();
await _videoPlayerController?.dispose();
_videoPlayerController = null;
_videoController = null;
_instance = null;
videoPlayerServiceHandler?.clear();
HarmonyChannel.releaseContinuation(this);
}

static void updatePlayCount() {
static Future<void> updatePlayCount() async {
if (_instance?._playerCount == 1) {
_instance?.dispose();
await _instance?.dispose();
} else {
_instance?._playerCount -= 1;
}
Expand Down
3 changes: 2 additions & 1 deletion lib/plugin/pl_player/view/view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ import 'package:PiliPlus/plugin/pl_player/widgets/common_btn.dart';
import 'package:PiliPlus/plugin/pl_player/widgets/forward_seek.dart';
import 'package:PiliPlus/plugin/pl_player/widgets/mpv_convert_webp.dart';
import 'package:PiliPlus/plugin/pl_player/widgets/play_pause_btn.dart';
import 'package:PiliPlus/utils/cache_manager_ext.dart';
import 'package:PiliPlus/utils/duration_utils.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart';
Expand All @@ -64,6 +65,7 @@ import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:canvas_danmaku/canvas_danmaku.dart';
import 'package:collection/collection.dart';
import 'package:easy_debounce/easy_throttle.dart';
Expand All @@ -74,7 +76,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'
show RenderProxyBox, SemanticsConfiguration;
import 'package:flutter/services.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:flutter_volume_controller/flutter_volume_controller.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/services/download/download_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ import 'package:PiliPlus/utils/extension/file_ext.dart';
import 'package:PiliPlus/utils/extension/string_ext.dart';
import 'package:PiliPlus/utils/id_utils.dart';
import 'package:PiliPlus/utils/path_utils.dart';
import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:path/path.dart' as path;
Expand Down
28 changes: 28 additions & 0 deletions lib/utils/cache_manager_ext.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import 'dart:io';

import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:stream_transform/stream_transform.dart';

/// Extension on [BaseCacheManager] to provide a [getSingleFile] convenience
/// method, which was available in flutter_cache_manager but is not included
/// in cached_network_image_ce's BaseCacheManager.
extension CacheManagerGetSingleFile on BaseCacheManager {
/// Returns a [Future<File>] of the cached or newly downloaded file.
///
/// This is functionally equivalent to the old `getSingleFile` from
/// flutter_cache_manager: it streams the file (from cache or network)
/// and returns the first [FileInfo]'s [File].
Future<File> getSingleFile(
String url, {
String? key,
Map<String, String>? headers,
}) async {
final fileInfo = await getFileStream(
url,
key: key,
headers: headers,
withProgress: false,
).whereType<FileInfo>().first;
return fileInfo.file;
}
}
Loading