relatica/lib/screens/image_viewer_screen.dart

94 wiersze
2.9 KiB
Dart

import 'dart:io';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter_file_dialog/flutter_file_dialog.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart';
import '../globals.dart';
import '../models/media_attachment.dart';
import '../services/auth_service.dart';
import '../utils/snackbar_builder.dart';
class ImageViewerScreen extends StatelessWidget {
final MediaAttachment attachment;
const ImageViewerScreen({super.key, required this.attachment});
Future<void> saveImage(BuildContext context) async {
final appsDir = await getApplicationDocumentsDirectory();
final filename = p.basename(attachment.fullFileUri.path);
final bytesResult = await getIt<AuthService>()
.currentClient
.value
.getFileBytes(attachment.uri);
if (bytesResult.isFailure) {
buildSnackbar(context,
'Error getting full size version of file: ${bytesResult.error}');
}
if (Platform.isAndroid || Platform.isIOS) {
final params = SaveFileDialogParams(
data: bytesResult.value,
fileName: filename,
);
await FlutterFileDialog.saveFile(params: params);
} else {
final location = await FilePicker.platform.saveFile(
dialogTitle: 'Save Image',
fileName: filename,
initialDirectory: appsDir.path,
);
if (location != null) {
await File(location).writeAsBytes(bytesResult.value);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
actions: [
IconButton(
onPressed: () => saveImage(context),
icon: const Icon(Icons.download))
],
),
body: SafeArea(
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
flex: 9,
child: InteractiveViewer(
clipBehavior: Clip.none,
constrained: true,
maxScale: 10.0,
scaleFactor: 0.1,
child:
CachedNetworkImage(imageUrl: attachment.uri.toString()),
),
),
if (attachment.description.isNotEmpty)
Expanded(
flex: 1,
child: Padding(
padding: const EdgeInsets.only(
left: 8.0,
right: 8.0,
bottom: 8.0,
),
child: SingleChildScrollView(
child: Text(attachment.description),
),
),
),
],
),
));
}
}