feat:增加闪灵上传图片功能

This commit is contained in:
2025-11-11 18:27:41 +08:00
parent 4ac7b2a698
commit 703a5a6aeb
7 changed files with 212 additions and 14 deletions

View File

@@ -1,5 +1,7 @@
import 'package:file_picker/file_picker.dart';
import 'package:flisp_app/models/flisp.dart';
import 'package:flisp_app/provider/flisp_provider.dart';
import 'package:flisp_app/utils/minio_utils.dart';
import 'package:flisp_app/widgets/flisp_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_form_builder/flutter_form_builder.dart';
@@ -45,6 +47,21 @@ class _FlispFormState extends State<FlispForm> {
});
}
void _selectImage(String fileName) {
final provider = Provider.of<FlispProvider>(context, listen: false);
setState(() {
provider.formItem.imageUrl =
'${MinIOHelper().rustfsFileUrl}/${MinIOHelper().bucketName}/$fileName';
});
}
void _deleteImage() {
final provider = Provider.of<FlispProvider>(context, listen: false);
setState(() {
provider.formItem.imageUrl = '';
});
}
@override
Widget build(BuildContext context) {
final int maxContentCount = 100;
@@ -105,15 +122,35 @@ class _FlispFormState extends State<FlispForm> {
SizedBox(height: 8),
buildFlispTag(provider.formItem),
SizedBox(height: 12),
if (provider.formItem.imageUrl.isNotEmpty)
buildFlispImage(
flisp: provider.formItem,
showDelete: true,
onDelete: _deleteImage,
),
],
),
),
);
}
void selectImage() async {
FilePickerResult? result = await FilePicker.platform.pickFiles(
type: FileType.custom,
allowedExtensions: ['jpg', 'jpeg', 'png'],
allowMultiple: false,
);
if (result != null) {
PlatformFile file = result.files.first;
final fileName = await MinIOHelper().uploadFile(file: file);
_selectImage(fileName);
}
}
Widget buildSelectImageButton() {
return GestureDetector(
onTap: () {},
onTap: () => selectImage(),
child: Container(
width: 36,
height: 36,

View File

@@ -98,26 +98,64 @@ Widget _buildFlispContent(Flisp flisp) {
);
}
Widget _buildFlispImage(Flisp flisp) {
Widget _buildDeleteImage(VoidCallback? onDelete) {
return Positioned(
top: -8,
right: 0,
child: GestureDetector(
onTap: onDelete,
child: Container(
width: 24,
height: 24,
decoration: BoxDecoration(
color: Colors.red,
shape: BoxShape.circle,
boxShadow: [
BoxShadow(
color: Colors.black.withAlpha(10),
blurRadius: 4,
offset: Offset(0, 2),
),
],
),
child: Icon(Icons.close, color: Colors.white, size: 16),
),
),
);
}
Widget buildFlispImage({
required Flisp flisp,
bool showDelete = false,
VoidCallback? onDelete,
}) {
return Container(
height: 150,
height: 200,
margin: const EdgeInsets.only(bottom: 8),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
image: DecorationImage(
image: NetworkImage(flisp.imageUrl),
fit: BoxFit.cover,
fit: BoxFit.contain,
),
),
child: Container(
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(8),
color: Colors.black.withOpacity(0.3),
color: Colors.black.withAlpha(10),
),
alignment: Alignment.topRight,
child: const Padding(
padding: EdgeInsets.all(6.0),
child: Icon(Icons.image, color: Colors.white, size: 20),
child: Stack(
clipBehavior: Clip.none,
children: [
Align(
alignment: Alignment.topRight,
child: const Padding(
padding: EdgeInsets.all(6.0),
child: Icon(Icons.image, color: Colors.white, size: 20),
),
),
if (showDelete) _buildDeleteImage(onDelete),
],
),
),
);
@@ -253,7 +291,7 @@ Widget _buildFlispItem({
children: [
_buildFlispContent(flisp),
const SizedBox(height: 8),
if (hasImage) _buildFlispImage(flisp),
if (hasImage) buildFlispImage(flisp: flisp, showDelete: false),
const SizedBox(height: 4),
if (hasVideo) _buildFlispVideo(flisp),
const SizedBox(height: 4),