Если вы Flutter Engineer и ищете способ, чтобы ваше приложение поддерживало возможность делать снимки экрана, используйте этот «снимок экрана». Это довольно полезный пакет, разработанный для этой конкретной цели и многих других, которые будут рассмотрены позже в середине этой статьи. Итак, давайте изучим это.
Содержание
Установка и настройка пакета
Захват виджетов в виде изображений
Захват неотрендеренных виджетов
Сохранение захваченного изображения
Совместное использование захваченного изображения
Мы рассмотрим все эти разделы один за другим, чтобы иметь полное представление обо всем.
1- Установка и настройка пакета
Сначала перейдите на pub.dev, найдите «скриншот» и установите оттуда.
Установите этот пакет с помощью первого подхода
— — — — — — -or — — — — — -
Запишите эту команду в терминале
flutter pub add screenshot
После того, как мы закончим. Давайте создадим сценарий для нашего проекта.
Структура проекта
Создайте виджет с отслеживанием состояния и создайте несколько случайных виджетов, точно так же, как мы делаем с нашими повседневными тренировочными приложениями.
Примечание. Вы будете использовать один и тот же подход для своих реальных, средних или сложных проектов. В своих статьях я всегда изо всех сил стараюсь создать этот импульс, чтобы любой, кто читает мои материалы, не сталкивался с какими-либо проблемами (относительно этого домена) в будущем.
Однако этот пакет имеет различные подходы к использованию, поэтому давайте рассмотрим их.
Перейдем к следующему разделу…
2- Захват виджетов в виде изображений
Это первый подход, который мы будем использовать в пакете «скриншот».
Сначала создайте экземпляр «ScreenshotController».
ScreenshotController screenshotController = ScreenshotController();
Как мы и планировали, случайные виджеты станут структурой проекта. Я не буду упоминать нужные виджеты, а просто выделю их как «your_widget…».
Рассмотрим этот фрагмент
body: Screenshot<Widget>( controller: screenshotController, child: your_widget()... ),
Примечание. Мы можем обернуть любой виджет, чтобы захватить его как изображение. Ограничений нет.
Затем нам нужно событие обратного вызова для захвата снимков экрана. Для этого мы используем ElevatedButton и заполняем onPressed:
ElevatedButton(onPressed: () { ///Just capture screenshotController.capture(); ///Capture and save to a file screenshotController.capture().then((img) { image = img; // image is of type Uint8List }); }, child: const Text("Capture")),
На этом первый подход завершается.
3- Захват неотрендеренных виджетов
Как следует из названия, у нас не визуализируются/не отображаются виджеты на экране, вместо этого мы создаем их во время вызова захвата.
Позвольте мне показать вам образец фрагмента
ElevatedButton(onPressed: () { ///Just capture screenshotController.captureFromWidget(your_widget()); ///Capture and save to a file screenshotController.captureFromWidget(your_widget(), delay: const Duration(seconds: 1)).then((value) { image = value; }); }, child: const Text("Capture")),
Здесь я просто заменил "capture" на "captureFromWidget" и применил небольшую задержку, чтобы задача могла выполняться гладко.
Таким образом, мы можем захватывать невидимые виджеты.
Здесь мы закончили со вторым.
4- Сохранение захваченного изображения
Теперь, чтобы сохранить наше захваченное изображение в галерее, нам нужно установить еще два пакета.
1- Заставка галереи изображений
2- Поставщик пути
Для всех подходов, упомянутых выше, изменение onPressedEvents с помощью «сохранения кода» приведет к созданию такого фрагмента.
ElevatedButton(onPressed: () async { ///Capture and saving to a file screenshotController.captureFromWidget(your_widget(), delay: const Duration(seconds: 1)).then((value) async { image = value; final dir = await getApplicationDocumentsDirectory(); final imagePath = await File('${dir.path}/captured.png').create(); await imagePath.writeAsBytes(image!); }); }, child: const Text("Capture")),
Здесь мы сделали следующие 3 шага, чтобы сохранить наше изображение в галерее.
Получен каталог (path_provider)
Создан формат файла
Сохранить в галерее
Наконец-то мы можем использовать Snack bar или Toast, чтобы сообщить об этом конечному пользователю.
Заглянем в последний.
5- Совместное использование захваченного изображения
Для этого нам нужно немного изменить наш проект.
Установите другой пакет с именем «share_plus».
И добавьте к существующему коду новую строку:
ElevatedButton(onPressed: () async { ///Capture and saving to a file screenshotController.captureFromWidget(your_widget(), delay: const Duration(seconds: 1)).then((value) async { image = value; final dir = await getApplicationDocumentsDirectory(); final imagePath = await File('${dir.path}/captured.png').create(); await imagePath.writeAsBytes(image!); ///Share await Share.shareFiles([imagePath.path]); }); }, child: const Text("Capture")),
Мы закончили и с этим.
Наконец, мне нужно поделиться некоторыми ключевыми моментами, чтобы избавиться от любых проблем.
Ключевые моменты, которые следует помнить
Для пакета Gallery Saver добавьте:
android:requestLegacyExternalStorage="true"
Внутренний ‹тег› приложения в AndroidManifest.xml
Во-вторых,
Используйте блок try-catch, чтобы избежать сбоев.
Пришло время подвести итоги этой статьи.
Вот и все!
Понравилась эта статья, 👏 и подписывайтесь на меня!!
Если я что-то пропустил, дайте мне знать в разделе ответов Medium.
Кроме того, дайте мне знать, если у вас есть какие-либо предложения для моей следующей статьи.
P.S. У меня есть собственный канал на YouTube, на который я загружаю контент, связанный с Flutter Series, GitHub и т. д. Если вы найдете материалы своего типа, ставьте лайк, делитесь и подписывайтесь, так как это мотивирует меня создавать для вас больше! Спасибо.