Irbisa · Шпаргалка
Изображения, видео и камера
Пайплайн изображений, ImageCache, декодирование, video_player, камера, аудио, EXIF, превью
Как Flutter выбирает между версиями ассета 1x, 2x и 3x и что пойдёт не так, если положить только одну?
# pubspec.yaml: list the main file (or its folder); variants are found automaticallyflutter: assets: - assets/images/logo.png # On disk:…Как показать SVG во Flutter и почему виджет
Imageне умеет его отображать?import 'package:flutter_svg/flutter_svg.dart'; Widget emptyState() => SvgPicture.asset( 'assets/icons/empty_state.svg', // declared under flutter: assets: width: 160, colorFilter: const ColorFilter.mode(Colors.grey, BlendMode.srcIn),…Как воспроизвести аудиофайл во Flutter и что нужно сделать с плеером, когда экран закрывается?
class DingButton extends StatefulWidget { const DingButton({super.key}); @override State<DingButton> createState() => _DingButtonState();}…Как
Image.networkзагружает и кеширует картинку и какую роль играютImageProvider,ImageStreamиImageCache?Сетка фотографий в полном разрешении съедает всю память, хотя
imageCacheограничен 100 МБ. Почему и как это исправить?class PhotoGrid extends StatelessWidget { const PhotoGrid({super.key, required this.urls}); final List<String> urls; @override Widget build(BuildContext context) {…Аватар чёткий на старом телефоне, но мыльный на новом, а некоторые фото выглядят сплющенными. Что не так с этим кодом?
Widget avatar(String url) { return ClipOval( child: Image.network( url, width: 96, height: 96, fit: BoxFit.cover, cacheWidth: 96, cacheHeight: 96, ), );}Вы прогреваете кеш hero-картинки вот так, но экран деталей всё равно сначала показывает плейсхолдер. Почему?
Future<void> openDetails(BuildContext context, Product p) async { await precacheImage(NetworkImage(p.heroUrl), context); if (!context.mounted) return; Navigator.of(context).push(MaterialPageRoute( builder: (_) => Image.network( p.heroUrl, cacheWidth: 1080, loadingBuilder: (context, child, progress) => progress == null ? child : const HeroPlaceholder(), ), ));}Что
cached_network_imageдобавляет поверхImage.networkи что всё равно приходится настраивать самому?final feedCache = CacheManager( Config( 'feedImages', stalePeriod: const Duration(days: 7), // unused files are deleted after 7 days; freshness comes from Cache-Control maxNrOfCacheObjects: 2000, ),…Найдите баг: после загрузки нового аватара профиль показывает старое фото, пока приложение не перезапустят.
class _ProfileHeaderState extends State<ProfileHeader> { late User _user = widget.user; Future<void> _changeAvatar(Uint8List cropped) async { // The server overwrites users/<id>/avatar.jpg and returns the updated user. final updated = await widget.api.uploadAvatar(_user.id, cropped); if (!mounted) return; setState(() => _user = updated); } @override Widget build(BuildContext context) => CircleAvatar( radius: 48, backgroundImage: NetworkImage(_user.avatarUrl), );}Как дать пользователю выбрать фото или сделать снимок через
image_pickerи какие разрешения для этого нужны на iOS и Android?final _picker = ImagePicker(); Future<XFile?> pickPhoto({required bool fromCamera}) { return _picker.pickImage( source: fromCamera ? ImageSource.camera : ImageSource.gallery, maxWidth: 2048, // resized natively, before Dart sees it…Фото, загруженные с телефона, на сайте отображаются повёрнутыми. Почему и как это исправить до загрузки?
Future<Uint8List> prepareForUpload(String path) async { final bytes = await FlutterImageCompress.compressWithFile( path, minWidth: 2048, // shrinks until the shorter side is 2048; never upscales minHeight: 2048, quality: 82,…Сжатие фото перед загрузкой замораживает UI на секунду-две. Почему
awaitне помогает и как это исправить?// wrong: runs on the UI isolate; no frames until it returns.Future<Uint8List> shrinkOnUiIsolate(Uint8List bytes) async { final decoded = img.decodeImage(bytes)!; return img.encodeJpg(img.copyResize(decoded, width: 2048), quality: 82);}…Как воспроизвести видео через
video_playerи что нужно учесть в жизненном цикле контроллера?class ClipPlayer extends StatefulWidget { const ClipPlayer({super.key, required this.url}); final Uri url; @override State<ClipPlayer> createState() => _ClipPlayerState();…Этот ролик начинается сначала и память растёт при каждой перестройке родителя. Что не так с виджетом?
class ClipView extends StatelessWidget { const ClipView({super.key, required this.url}); final Uri url; @override Widget build(BuildContext context) { final controller = VideoPlayerController.networkUrl(url) ..initialize() ..play(); return AspectRatio( aspectRatio: 16 / 9, child: VideoPlayer(controller), ); }}Что нужно, чтобы аудио продолжало играть при заблокированном экране и показывало управление на экране блокировки: на iOS, Android и в Dart?
// Info.plist: UIBackgroundModes = [audio]// AndroidManifest.xml: FOREGROUND_SERVICE and FOREGROUND_SERVICE_MEDIA_PLAYBACK,// plus audio_service's service with foregroundServiceType="mediaPlayback".late final AudioHandler audioHandler; Future<void> main() async {…Найдите баг: после возврата приложения из фона превью камеры остаётся чёрным, а в логе появляется
CameraException.class _ScannerState extends State<Scanner> with WidgetsBindingObserver { late final _camera = CameraController(widget.camera, ResolutionPreset.medium) ..initialize().then((_) => mounted ? setState(() {}) : null); // initState: addObserver. dispose: removeObserver, _camera.dispose() // build: CameraPreview(_camera) @override void didChangeAppLifecycleState(AppLifecycleState state) { // free the camera for other apps if (state == AppLifecycleState.inactive) _camera.dispose(); if (state == AppLifecycleState.resumed) { _camera.initialize(); // take it back } }}Где должен происходить ресайз картинок (на клиенте, в CDN-сервисе изображений или в пайплайне загрузки) и почему?
Покрывает ли
video_playerадаптивный стриминг (HLS/DASH) и DRM и что использовать, когда не покрывает?Как с плагином
cameraанализировать кадры изstartImageStream, чтобы превью не дёргалось?CameraController createController(CameraDescription camera) => CameraController( camera, ResolutionPreset.medium, // enough for detection, far less work per frame enableAudio: false, imageFormatGroup: Platform.isAndroid ? ImageFormatGroup.nv21 : ImageFormatGroup.bgra8888,…Когда для показа кадров видео или камеры использовать
Texture, а когда platform view и сколько каждый стоит на кадр?Как бы вы спроектировали офлайн-загрузку видео или выпусков подкаста: что скачивать, где хранить и как ограничить занимаемое место?