- Adding a photo (quick-add and detail) now offers a Camera / Gallery chooser (shared pickPhoto helper); camera errors on desktop degrade gracefully. - Full-screen viewer: pinch-to-zoom pans only while zoomed, so a plain horizontal swipe pages between photos again. 54 tests green; Linux runs.
46 lines
1.4 KiB
Dart
46 lines
1.4 KiB
Dart
import 'dart:typed_data';
|
|
|
|
import 'package:flutter/material.dart';
|
|
import 'package:image_picker/image_picker.dart';
|
|
|
|
import '../i18n/strings.g.dart';
|
|
|
|
/// Asks the user to take a photo or pick one from the gallery, then returns its
|
|
/// bytes (or null if cancelled/unavailable). Camera failures — e.g. on desktop,
|
|
/// which has no camera — are swallowed and yield null.
|
|
Future<Uint8List?> pickPhoto(BuildContext context) async {
|
|
final t = context.t;
|
|
final source = await showModalBottomSheet<ImageSource>(
|
|
context: context,
|
|
builder: (sheetContext) => SafeArea(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
ListTile(
|
|
key: const Key('photo.source.camera'),
|
|
leading: const Icon(Icons.photo_camera_outlined),
|
|
title: Text(t.photo.camera),
|
|
onTap: () => Navigator.of(sheetContext).pop(ImageSource.camera),
|
|
),
|
|
ListTile(
|
|
key: const Key('photo.source.gallery'),
|
|
leading: const Icon(Icons.photo_library_outlined),
|
|
title: Text(t.photo.gallery),
|
|
onTap: () => Navigator.of(sheetContext).pop(ImageSource.gallery),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
if (source == null) return null;
|
|
try {
|
|
final file = await ImagePicker().pickImage(
|
|
source: source,
|
|
maxWidth: 1280,
|
|
imageQuality: 80,
|
|
);
|
|
return file?.readAsBytes();
|
|
} on Object {
|
|
return null;
|
|
}
|
|
}
|