下载和复制链接

This commit is contained in:
cuiyouliang 2025-08-26 15:22:16 +08:00
parent 26b8b5abf3
commit 53f368938a
4 changed files with 140 additions and 9 deletions

View File

@ -7,6 +7,7 @@ class MyToast {
required String title, required String title,
String? type, // String? type, //
String? position, // String? position, //
Duration? duration
}) { }) {
final baseStyle = position == 'top' final baseStyle = position == 'top'
? MyDialog.theme.toastStyle?.top() ? MyDialog.theme.toastStyle?.top()
@ -16,7 +17,7 @@ class MyToast {
MyDialog.toast( MyDialog.toast(
title, title,
icon: type == 'success' ? const Icon(Icons.check_circle) : Icon(Icons.warning), icon: type == 'success' ? const Icon(Icons.check_circle) : Icon(Icons.warning),
duration: Duration(milliseconds: 5000), duration: duration ?? const Duration(milliseconds: 5000),
style: baseStyle?.copyWith( style: baseStyle?.copyWith(
backgroundColor: type == 'success' ? Colors.green.withAlpha(200) : Colors.red.withAlpha(200), backgroundColor: type == 'success' ? Colors.green.withAlpha(200) : Colors.red.withAlpha(200),
), ),

View File

@ -1,9 +1,9 @@
/// ///
library; library;
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
@ -17,6 +17,8 @@ import 'package:loopin/components/network_or_asset_image.dart';
import 'package:loopin/models/summary_type.dart'; import 'package:loopin/models/summary_type.dart';
import 'package:loopin/service/http.dart'; import 'package:loopin/service/http.dart';
import 'package:loopin/utils/wxsdk.dart'; import 'package:loopin/utils/wxsdk.dart';
import 'package:loopin/utils/permissions.dart';
import 'package:loopin/utils/download_video.dart';
import 'package:media_kit/media_kit.dart'; import 'package:media_kit/media_kit.dart';
import 'package:media_kit_video/media_kit_video.dart'; import 'package:media_kit_video/media_kit_video.dart';
import 'package:media_kit_video/media_kit_video_controls/src/controls/extensions/duration.dart'; import 'package:media_kit_video/media_kit_video_controls/src/controls/extensions/duration.dart';
@ -903,14 +905,81 @@ void handleComment(index) {
void handleShareClick(int index) { void handleShareClick(int index) {
print("分享项 $index 被点击"); print("分享项 $index 被点击");
final description = videoList[videoModuleController.videoPlayIndex.value]['title'] ?? '获取title失败'; final videoId = videoList[videoModuleController.videoPlayIndex.value]['id'];
final videoUrl = videoList[videoModuleController.videoPlayIndex.value]['url'];
if (index == 1) { final description = videoList[videoModuleController.videoPlayIndex.value]['title'] ?? '快来看看这个视频';
// var httpPrefix = 'http://43.143.227.203/adv';
Wxsdk.shareToFriend(title: '快来看看这个视频', description: description, webpageUrl: 'https://baidu.com'); logger.i('分享链接地址----------------: ${httpPrefix}/goods-detail?id=${videoId}');
if (index == 0) {
//
Wxsdk.shareToFriend(title: '快来看看这个视频', description: description, webpageUrl: '${httpPrefix}/video-detail?id=${videoId}');
} else if (index == 1) {
//
Wxsdk.shareToTimeline(title: '快来看看这个视频', webpageUrl: '${httpPrefix}/goods-detail?id=${videoId}');
} else if (index == 2) { } else if (index == 2) {
// //
Wxsdk.shareToTimeline(title: '快来看看这个视频', webpageUrl: 'https://baidu.com'); copyToClipboard(videoUrl);
} else if (index == 3) {
//
_downloadVideoWithDio(videoUrl,description);
}
}
//
void copyToClipboard(String text) async {
try {
await Clipboard.setData(ClipboardData(text: text));
MyToast().tip(
title: '链接已复制到剪贴板',
position: 'center',
type: 'success',
);
} catch (e) {
MyToast().tip(
title: '复制失败',
position: 'center',
type: 'success',
);
}
}
//
Future<void> _downloadVideoWithDio(String videoUrl, String fileName) async {
try {
//
String? toastId; // toast的ID便
var status = await Permissions.requestStoragePermission();
if (!status) {
MyToast().tip(
title: '需要存储权限才能下载视频',
position: 'center',
type: 'success',
);
return;
}
await DownloadManager.downloadFile(
url: videoUrl,
fileName: '$fileName.mp4',
onProgress: (progress) {
print("下载进度: $progress%");
//
},
onComplete: (filePath) {
MyToast().tip(
title: '下载完成',
position: 'center',
type: 'success',
);
},
onError: (error) {
MyToast().tip(
title: '下载失败: $error',
position: 'center',
type: 'error',
);
},
);
} catch (e) {
print("下载视频失败: $e");
} }
} }

View File

@ -0,0 +1,56 @@
///
library;
import 'dart:io';
import 'dart:async';
import 'package:path_provider/path_provider.dart';
import 'package:dio/dio.dart';
//
class DownloadManager {
static final Dio _dio = Dio();
static Future<String> downloadFile({
required String url,
required String fileName,
required Function(int) onProgress,
required Function(String) onComplete,
required Function(String) onError,
}) async {
try {
//
Directory directory;
if (Platform.isAndroid) {
directory = await getExternalStorageDirectory() ?? await getApplicationDocumentsDirectory();
} else {
directory = await getApplicationDocumentsDirectory();
}
String downloadDir = '${directory.path}/Downloads';
await Directory(downloadDir).create(recursive: true);
String safeFileName = _getSafeFileName(fileName);
String filePath = '$downloadDir/$safeFileName';
await _dio.download(
url,
filePath,
onReceiveProgress: (received, total) {
if (total != -1) {
int progress = (received / total * 100).toInt();
onProgress(progress);
}
},
);
onComplete(filePath);
return filePath;
} catch (e) {
onError(e.toString());
rethrow;
}
}
static String _getSafeFileName(String fileName) {
return fileName.replaceAll(RegExp(r'[<>:"/\\|?*]'), '_');
}
}

View File

@ -41,6 +41,11 @@ class Permissions {
return await _checkAndRequest(Permission.microphone); return await _checkAndRequest(Permission.microphone);
} }
//
static Future<bool> requestStoragePermission() async {
return await _checkAndRequest(Permission.storage);
}
// //
static Future<bool> _checkAndRequest(Permission permission) async { static Future<bool> _checkAndRequest(Permission permission) async {
final status = await permission.status; final status = await permission.status;