Рано или поздно в вашем проекте может возникнуть задача — получить скриншот конкретного виджета. Как это реализовать?
Существует несколько подходов:
▪️Готовое решение — например, пакет
screenshot▪️Более низкоуровневый подход — через
RenderRepaintBoundary💡Интересный факт: внутри себя
screenshot использует RenderRepaintBoundary, поэтому понимание его работы будет полезным даже при использовании готового пакета.В этом посте мы рассмотрим, как превратить любой виджет в изображение, готовое для ваших дальнейших действий.
1. Создаем глобальный ключ
Он нужен, чтобы получить доступ к
RenderRepaintBoundary:final GlobalKey _widgetKey = GlobalKey();
2. Оборачиваем нужный виджет в
RepaintBoundaryЭто гарантирует, что будет захвачен только нужный виджет.
RepaintBoundary(
key: _widgetKey,
child: const SomeWidget(),
)
3. Захватываем изображение
Метод, который преобразует виджет в
Uint8List:Future<void> _captureAndSave(BuildContext context) async {
try {
// Получаем рендер-границу по ключу
final boundary = _widgetKey.currentContext!.findRenderObject() as RenderRepaintBoundary;
// Захватываем изображение (можно увеличить pixelRatio для лучшего качества)
final image = await boundary.toImage(pixelRatio: 3.0);
// Преобразуем изображение в байты
final byteData = await image.toByteData(format: ui.ImageByteFormat.png);
final pngBytes = byteData!.buffer.asUint8List();
// Тут можно сохранить файл.
...
} catch (e) {
debugPrint('Ошибка при захвате: $e');
}
}Вот и все! Теперь у нас есть изображение в виде байтов (
Uint8List), с которым можно делать все, что угодно:✔️сохранить в файл
✔️передать по сети
✔️вложить в PDF
✔️отобразить в UI
🧠 Немного теории:
RepaintBoundary – важный инструмент для оптимизации производительности. Он создает «графическую границу», отделяя часть дерева виджетов от остального. Это позволяет:▫️изолировать перерисовки
▫️ повысить производительность
▫️ использовать offscreen rendering
▫️ делать захват изображения (как в нашем примере)
Ставьте ❤️ — и в следующем посте глубже рассмотрим
RepaintBoundary: как он работает, влияет на рендеринг и какие у него есть особенности