feat(photos): camera-or-gallery picker + swipeable full-screen viewer
- 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.
This commit is contained in:
parent
4b209d6752
commit
c789cd1027
8 changed files with 136 additions and 40 deletions
46
apps/app_seeds/lib/ui/photo_pick.dart
Normal file
46
apps/app_seeds/lib/ui/photo_pick.dart
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue