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 pickPhoto(BuildContext context) async { final t = context.t; final source = await showModalBottomSheet( 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; } }