mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-07-04 16:20:14 +08:00
@@ -18,7 +18,6 @@ import 'package:PiliPlus/utils/page_utils.dart';
|
||||
import 'package:PiliPlus/utils/storage.dart';
|
||||
import 'package:PiliPlus/utils/update.dart';
|
||||
import 'package:PiliPlus/utils/utils.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/material.dart' hide ListTile;
|
||||
import 'package:flutter/services.dart' show Clipboard, ClipboardData;
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
@@ -339,30 +338,17 @@ Future<void> showInportExportDialog<T>(
|
||||
ListTile(
|
||||
dense: true,
|
||||
title: const Text('导出文件至本地', style: style),
|
||||
onTap: () async {
|
||||
onTap: () {
|
||||
Get.back();
|
||||
final res = utf8.encode(toJson());
|
||||
final name =
|
||||
'piliplus_${label}_${context.isTablet ? 'pad' : 'phone'}_'
|
||||
'${DateFormat('yyyyMMddHHmmss').format(DateTime.now())}.json';
|
||||
try {
|
||||
final path = await FilePicker.platform.saveFile(
|
||||
allowedExtensions: ['json'],
|
||||
type: FileType.custom,
|
||||
fileName: name,
|
||||
bytes: Utils.isDesktop ? null : res,
|
||||
);
|
||||
if (path == null) {
|
||||
SmartDialog.showToast("取消保存");
|
||||
return;
|
||||
}
|
||||
if (Utils.isDesktop) {
|
||||
await File(path).writeAsBytes(res);
|
||||
}
|
||||
SmartDialog.showToast("已保存");
|
||||
} catch (e) {
|
||||
SmartDialog.showToast("保存失败: $e");
|
||||
}
|
||||
Utils.saveBytes2File(
|
||||
name: name,
|
||||
bytes: res,
|
||||
allowedExtensions: const ['json'],
|
||||
);
|
||||
},
|
||||
),
|
||||
ListTile(
|
||||
|
||||
@@ -82,7 +82,10 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
|
||||
).colorScheme.secondaryContainer.withValues(alpha: 0.5);
|
||||
|
||||
void onClear() {
|
||||
pathList.removeAt(index);
|
||||
final path = pathList.removeAt(index);
|
||||
if (Utils.isMobile) {
|
||||
File(path).tryDel();
|
||||
}
|
||||
if (pathList.isEmpty && editController.rawText.trim().isEmpty) {
|
||||
enablePublish.value = false;
|
||||
}
|
||||
@@ -148,8 +151,9 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
|
||||
|
||||
Future<void> onCropImage(int index) async {
|
||||
late final colorScheme = ColorScheme.of(context);
|
||||
CroppedFile? croppedFile = await ImageCropper.platform.cropImage(
|
||||
sourcePath: pathList[index],
|
||||
final sourcePath = pathList[index];
|
||||
final croppedFile = await ImageCropper.platform.cropImage(
|
||||
sourcePath: sourcePath,
|
||||
uiSettings: [
|
||||
AndroidUiSettings(
|
||||
toolbarTitle: '裁剪',
|
||||
@@ -161,6 +165,7 @@ abstract class CommonRichTextPubPageState<T extends CommonRichTextPubPage>
|
||||
],
|
||||
);
|
||||
if (croppedFile != null) {
|
||||
File(sourcePath).tryDel();
|
||||
pathList[index] = croppedFile.path;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ import 'package:PiliPlus/utils/accounts.dart';
|
||||
import 'package:PiliPlus/utils/utils.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
|
||||
class CreateVoteController extends GetxController {
|
||||
CreateVoteController(this.voteId);
|
||||
@@ -109,9 +108,9 @@ class CreateVoteController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> onUpload(int index, XFile pickedFile) async {
|
||||
Future<void> onUpload(int index, String path) async {
|
||||
var res = await MsgHttp.uploadBfs(
|
||||
path: pickedFile.path,
|
||||
path: path,
|
||||
category: 'daily',
|
||||
biz: 'vote',
|
||||
);
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
import 'dart:io' show File;
|
||||
|
||||
import 'package:PiliPlus/common/widgets/button/icon_button.dart';
|
||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||
import 'package:PiliPlus/models/dynamics/vote_model.dart';
|
||||
import 'package:PiliPlus/pages/dynamics_create_vote/controller.dart';
|
||||
import 'package:PiliPlus/utils/date_utils.dart';
|
||||
import 'package:PiliPlus/utils/extension.dart';
|
||||
import 'package:PiliPlus/utils/utils.dart';
|
||||
import 'package:easy_debounce/easy_throttle.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -414,7 +417,12 @@ class _CreateVotePageState extends State<CreateVotePage> {
|
||||
source: ImageSource.gallery,
|
||||
);
|
||||
if (pickedFile != null) {
|
||||
_controller.onUpload(index, pickedFile);
|
||||
final path = pickedFile.path;
|
||||
_controller.onUpload(index, path).whenComplete(() {
|
||||
if (Utils.isMobile) {
|
||||
File(path).tryDel();
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
SmartDialog.showToast(e.toString());
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'dart:io' show File;
|
||||
|
||||
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
|
||||
import 'package:PiliPlus/http/fav.dart';
|
||||
import 'package:PiliPlus/http/msg.dart';
|
||||
@@ -118,8 +120,8 @@ class _CreateFavPageState extends State<CreateFavPage> {
|
||||
if (pickedFile != null && mounted) {
|
||||
String imgPath = pickedFile.path;
|
||||
if (Utils.isMobile) {
|
||||
CroppedFile? croppedFile = await ImageCropper.platform.cropImage(
|
||||
sourcePath: pickedFile.path,
|
||||
final croppedFile = await ImageCropper.platform.cropImage(
|
||||
sourcePath: imgPath,
|
||||
uiSettings: [
|
||||
AndroidUiSettings(
|
||||
toolbarTitle: '裁剪',
|
||||
@@ -141,6 +143,7 @@ class _CreateFavPageState extends State<CreateFavPage> {
|
||||
],
|
||||
);
|
||||
if (croppedFile != null) {
|
||||
File(imgPath).tryDel();
|
||||
imgPath = croppedFile.path;
|
||||
}
|
||||
}
|
||||
@@ -157,6 +160,9 @@ class _CreateFavPageState extends State<CreateFavPage> {
|
||||
SmartDialog.showToast(res['msg']);
|
||||
}
|
||||
}
|
||||
if (Utils.isMobile) {
|
||||
File(imgPath).tryDel();
|
||||
}
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'dart:io' show File;
|
||||
|
||||
import 'package:PiliPlus/common/constants.dart';
|
||||
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
|
||||
import 'package:PiliPlus/http/constants.dart';
|
||||
@@ -488,10 +490,10 @@ class _EditProfilePageState extends State<EditProfilePage> {
|
||||
SmartDialog.showToast('不能选GIF');
|
||||
return;
|
||||
}
|
||||
String? imagePath;
|
||||
String? imagePath = pickedFile.path;
|
||||
if (Utils.isMobile) {
|
||||
CroppedFile? croppedFile = await ImageCropper.platform.cropImage(
|
||||
sourcePath: pickedFile.path,
|
||||
final croppedFile = await ImageCropper.platform.cropImage(
|
||||
sourcePath: imagePath,
|
||||
uiSettings: [
|
||||
AndroidUiSettings(
|
||||
toolbarTitle: '裁剪',
|
||||
@@ -514,11 +516,8 @@ class _EditProfilePageState extends State<EditProfilePage> {
|
||||
),
|
||||
],
|
||||
);
|
||||
if (croppedFile != null) {
|
||||
imagePath = croppedFile.path;
|
||||
}
|
||||
} else {
|
||||
imagePath = pickedFile.path;
|
||||
File(imagePath).tryDel();
|
||||
imagePath = croppedFile?.path;
|
||||
}
|
||||
if (imagePath != null) {
|
||||
Request()
|
||||
@@ -536,10 +535,17 @@ class _EditProfilePageState extends State<EditProfilePage> {
|
||||
.then((res) {
|
||||
if (res.data['code'] == 0) {
|
||||
SmartDialog.showToast('修改成功');
|
||||
Future.delayed(const Duration(milliseconds: 500), _getInfo);
|
||||
Future.delayed(const Duration(milliseconds: 500), () {
|
||||
if (mounted) {
|
||||
_getInfo();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
SmartDialog.showToast(res.data['message']);
|
||||
}
|
||||
if (Utils.isMobile && imagePath != null) {
|
||||
File(imagePath).tryDel();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,6 @@ import 'package:PiliPlus/utils/utils.dart';
|
||||
import 'package:PiliPlus/utils/video_utils.dart';
|
||||
import 'package:canvas_danmaku/canvas_danmaku.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:floating/floating.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@@ -1058,20 +1057,11 @@ class HeaderControlState extends State<HeaderControl> {
|
||||
);
|
||||
final name =
|
||||
'${introController.videoDetail.value.title}-${videoDetailCtr.bvid}-${videoDetailCtr.cid.value}-${item.lanDoc}.json';
|
||||
final path = await FilePicker.platform.saveFile(
|
||||
Utils.saveBytes2File(
|
||||
name: name,
|
||||
bytes: bytes,
|
||||
allowedExtensions: const ['json'],
|
||||
type: FileType.custom,
|
||||
fileName: name,
|
||||
bytes: Utils.isDesktop ? null : bytes,
|
||||
);
|
||||
if (path == null) {
|
||||
SmartDialog.showToast("取消保存");
|
||||
return;
|
||||
}
|
||||
if (Utils.isDesktop) {
|
||||
await File(path).writeAsBytes(bytes);
|
||||
}
|
||||
SmartDialog.showToast("已保存");
|
||||
}
|
||||
} catch (e) {
|
||||
if (kDebugMode) rethrow;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io' show File;
|
||||
|
||||
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
|
||||
import 'package:PiliPlus/common/widgets/loading_widget/loading_widget.dart';
|
||||
@@ -303,21 +304,20 @@ class _WhisperDetailPageState
|
||||
);
|
||||
} else {
|
||||
try {
|
||||
XFile? pickedFile = await imagePicker.pickImage(
|
||||
final XFile? pickedFile = await imagePicker.pickImage(
|
||||
source: ImageSource.gallery,
|
||||
imageQuality: 100,
|
||||
);
|
||||
if (pickedFile != null) {
|
||||
final path = pickedFile.path;
|
||||
SmartDialog.showLoading(msg: '正在上传图片');
|
||||
final result = await MsgHttp.uploadBfs(
|
||||
path: pickedFile.path,
|
||||
path: path,
|
||||
biz: 'im',
|
||||
);
|
||||
if (result['status']) {
|
||||
String mimeType =
|
||||
lookupMimeType(
|
||||
pickedFile.path,
|
||||
)?.split('/').getOrNull(1) ??
|
||||
lookupMimeType(path)?.split('/').getOrNull(1) ??
|
||||
'jpg';
|
||||
UploadBfsResData data = result['data'];
|
||||
Map picMsg = {
|
||||
@@ -329,10 +329,16 @@ class _WhisperDetailPageState
|
||||
'size': data.imgSize,
|
||||
};
|
||||
SmartDialog.showLoading(msg: '正在发送');
|
||||
await _whisperDetailController.sendMsg(
|
||||
picMsg: picMsg,
|
||||
onClearText: editController.clear,
|
||||
);
|
||||
await _whisperDetailController
|
||||
.sendMsg(
|
||||
picMsg: picMsg,
|
||||
onClearText: editController.clear,
|
||||
)
|
||||
.whenComplete(() {
|
||||
if (Utils.isMobile) {
|
||||
File(path).tryDel();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
SmartDialog.dismiss();
|
||||
SmartDialog.showToast(result['msg']);
|
||||
|
||||
Reference in New Issue
Block a user