Flutter. Много
2.76K subscribers
332 photos
23 videos
257 links
Заказать мобильную разработку: https://amiga.agency/?utm_source=tg
Заказать рекламу в канале @amiga_agency_bot

Новости Flutter-разработки, дайджесты мероприятий, личный опыт.
Download Telegram
1 Часть интервью с HR. Ответы на все ваши вопросы

Hola, Amigos! Из недавнего опроса стало понятно, что аудитория на нашем канале делится примерно 50/50 на junior и middle/senior. К нам часто начали поступать вопросы: что писать в сопроводительном письме? как найти работу джуну? как составить резюме?

Ура, момент настал! Мы взяли интервью у нашего Group Lead HR, Кати и вот, что она советует начинающим мобильным разработчикам.

1️⃣ На что ты обращаешь внимание на собеседовании с Flutter-разработчиком?

Я оцениваю софты, поэтому мой выбор складывается из того, подходит ли специалист нам по командному духу. Обращаю внимание на навыки устной и письменной коммуникации. Открытый ли он, легко ли и не односложно отвечает на вопросы, приводит ли примеры, не перебивает. Харды оценивает Team Lead.

2️⃣ Как составить резюме?

Дам несколько советов, как лучше НЕ делать:
1) Плохо составленное резюме: пустое или громоздкое с полотном текста и ошибками, с ссылками на код или на закрытый файл без доступа на просмотр.
2) Частая смена работы (минимум 6 месяцев в одной компании).
3) Раздел «О себе» может стать решающим, как в пользу кандидата, так и в «отказ». По нему сразу видно совпадают ли наши ценности.

В этом разделе лучше указывать:
– достижения в карьере;
– самые сильные навыки, относящиеся к желаемой должности;
– что вы для себя ищете, и чем полезны компании;
– телеграм или другие контакты. Это ускорит связь с вами, т.к. не у всех компаний открытие контактов в свободном доступе.

3️⃣ Важно ли сопроводительное письмо? Что в нём писать?

Да, оно очень приветствуется. Но есть несколько важных моментов:
– не нужно писать огромное полотно.
– рекрутер отсматривает около 100 резюме в день, на 1 резюме есть всего 2 мин.
– лучше всего писать персонализированное и ёмкое письмо с указанием релевантных навыков из вакансии, выражая интерес к задачам.

Продолжение завтра! Накидайте, пожалуйста, реакций, если было полезно! Амиговке Кате будет очень приятно❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥17👍9👎63🥰1
2 Часть интервью с HR. Ответы на все ваши вопросы

Hola, Amigos! Вот ещё несколько советов от Кати, Group Lead HR Amiga о том, как найти первую работу Flutter-разработчику.

1️⃣ Как устроен процесс поиска и приёма на работу?

Процесс поиска:
→ рекрутер смотрит отклик.
→ резюме отправляется на проверку Team Lead. Ожидание результата зависит от нагрузки специалиста, но рекрутер всегда старается ускорить процесс.
→ рекрутер связывается с понравившимися специалистами и назначает интервью.
→ принимаем решение в пользу человека с самыми подходящими нам хардами, и что очень важно — софтами.

На софты мы обращаем большое внимание, именно поэтому у нас очень комфортная атмосфера, о которой говорит вся команда. В такой обстановке легче и интереснее работать, больше желания развиваться, и задачи приносят удовольствие.

2️⃣ Как выбрать компанию для первой работы?

Это, скорее, дело «вкуса». Кто-то хочет стажироваться в крупной компании, а кто-то начать карьеру в небольшом агентстве с «семейной» атмосферой и большими возможностями для развития. Я думаю, что шанс есть всегда, нужно просто пробовать и не опускать руки!

3️⃣ Стоит ли откликаться в компании, у которых нет открытых вакансий?

Да, конечно!

1) Даже если нет вакансий, всегда можно пообщаться и попасть в резерв. В таком случае, при необходимости, первым делом с предложением придут именно к вам.

2) Не всегда вакансия опубликована на hh. Она может закрываться через тот же резерв, поэтому лучше делать всё от себя зависящее, чтобы попасть в компанию мечты.

3) Возможно, компания еще только планирует открывать вакансию, и ваше резюме будет очень кстати. Такие мэтчи не редкий случай!

4) Если вы начинающий специалист и хотите стажироваться, то компании часто готовы рассматривать такие варианты при наличии временных ресурсов.

Разработчики, делитесь в чате своим опытом прохождения собеседований и советами для резюме! Очень интересно, как вы начинали? 🦋
Please open Telegram to view this post
VIEW IN TELEGRAM
10👍5🔥4👎3
Полезные посты и статьи от нас и наших друзей, которые вы могли пропустить

Hola Amigos! Выбирайте, что вам интересно и переходите по ссылкам.

🔵Камера и Flutter

🔵Вложенная навигация во Flutter: что такое декларативный роутер и зачем он нужен

🔵«Заметки мобильного разработчика» о видеоплеере

🔵Анимация загрузки картинок во Flutter, или как сделать shimmer своими руками

🔵«Заметки мобильного разработчика» о скролле списков

⚪️Transition Animation: настраиваем анимацию переходов во Flutter

Приятного чтения! Ставьте реакцию, если такие подборки нужно делать чаще ⚙️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍83🔥3💩1🍓1
CustomPainter

Hola Amigos! На связи Ярослав Цемко, Flutter dev Amiga. Сегодня расскажу про CustomPainter, который позволяет создавать креативные виджеты с индивидуальным дизайном.

Когда вы работаете с CustomPainter, вам потребуется наследоваться от этого класса и определить два ключевых метода:

🟡Paint: Метод, в котором программируется рисование на холсте.
🟡shouldRepaint: Метод, который определяет, должен ли перерисовываться виджет, если класс, где-то обновился, например в StatefulWidget.

Пример:

class MyPainter extends CustomPainter {
@override
void paint(Canvas canvas, Size size) {
Paint paint = Paint();
paint.color = Colors.red;
paint.strokeWidth = 2.0;
Offset center = const Offset(100.0, 100.0);
canvas.drawCircle(center, 50.0, paint);
}

@override
bool shouldRepaint(covariant CustomPainter oldDelegate) {
return false;
}
}

Для работы с CustomPainter нужен виджет CustomPaint, который состоит из:

child: дочерний виджет.
painter: любой класс, который наследуется от CustomPainter.
foregroundPainter: параметр, который отвечает за рисование поверх дочернего виджета.
IsComplex: в случае, если графика, которую сложно отрисовывать, данный параметр указывает отрисовщику, что он сам должен определять какие части можно закэшировать.
willChange: параметр, который определяет будет ли кэшироваться данный виджет.

В следующем посте разберём, как на практике использовать CustomPainter. Ставьте 🔥, если ждете!
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥22👍2👏1🤡1
Практическое применение CustomPainter

Hola Amigos! На связи Ярослав Цемко, Flutter dev Amiga. Создадим овальную кнопку с CustomPainter.

Используем drawOval для овальной формы и TextPainter для создания текста. Также можно задать стиль, выравнивание и направление текста.

@override
void paint(Canvas canvas, Size size) {
Paint paint = Paint();
paint.color = Colors.red;
paint.strokeWidth = 2.0;
canvas.drawOval(
Rect.fromCenter(
center: size.center(Offset.zero),
width: size.width,
height: size.height,
),
paint);
TextSpan textSpan = TextSpan(
text: text,
style: textStyle,
);
TextPainter textPainter = TextPainter(
text: textSpan,
textAlign: textAlign ?? TextAlign.center,
textDirection: textDirection ?? TextDirection.ltr,
);
textPainter.layout();
final xCenter = (size.width - textPainter.width) / 2;
final yCenter = (size.height - textPainter.height) / 2;
final textOffset = Offset(xCenter, yCenter);
textPainter.paint(canvas, textOffset);
}

Обернём CustomPaint в ClipRect, чтобы поместить в дереве:

ClipRect(
child: CustomPaint(
painter: ButtonPainter(text: 'Кнопка'),
),
),

И в SizedBox, чтобы задать размеры:

SizedBox(
height: 50,
width: 100,
child: ClipRect(
child: CustomPaint(
painter: ButtonPainter(text: 'Кнопка'),
),
),
),

GestureDetector делает кнопку активной:

@override
Widget build(BuildContext context) => GestureDetector(
onTap: onTap,
child: SizedBox(
height: 50,
width: 100,
child: ClipRect(
child: CustomPaint(
painter: ButtonPainter(text: 'Кнопка'),
),
),
),
);
}


Ссылка на репозиторий 🦋

Рассказывайте в чате о своем опыте использования данного инструмента!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1👌1
Hola, Amigos! С наступающим Новым годом!

Подходит к завершению еще один год в нашей быстрой и динамичной индустрии. Он был наполнен вызовами, новыми технологиями и бесчисленными строчками кода. Но в этот праздничный момент, давайте на мгновение остановимся, чтобы почерпнуть вдохновение и силы для новых проектов ⚙️

Желаем вам в новом году стабильного кода, интересных проектов и безграничной креативности! Пусть каждая ваша работа будет успешной, а пользователи — благодарными.

Не забывайте отдыхать, проводить время с близкими и заряжаться энергией для новых свершений!

С наилучшими пожеланиями и до скорых встреч в новом 2024 году ⚙️
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍64🥰1
Hola, Amigos! Потихоньку выходим на связь после бурных праздников. И делимся с вами видео с выступлениями Саши и Тимура на конференции DevFest 2023.

Ребята рассказывали про свой опыт, реальные проекты, над которыми работали в Amiga. Проекты забирали серебро и бронзу на Tagline Awards, поэтому они стоят вашего внимания! Смотрите по ссылкам:

➡️ ML и Flutter
➡️ Камера и Flutter

Будем рады вашим комментариям!

P.S.: в 2024 году планируем активно участвовать в различных конференциях и организовывать митапы. Рассказывать об этом здесь? Вам интересно?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133🔥2
Обзор пакета audioplayers

Hola, Amigos! На связи Вова Зевеке, Flutter dev Amiga. Как вы уже догадались, пакет audioplayers позволяет проигрывать звуковой файл. Весь функционал можно показать двумя строчками кода:

final player = AudioPlayer();
await
player.play
(UrlSource('
https://example.com/my-audio.wav
'));


где у нас появляется контроллер AudioPlayer(), у которого можно вызвать методы:

play(Source): проиграть указанный аудиофайл;
setVolume(double): установить громкость звука при проигрывании;
setSource(Source): установить источник звука для этого проигрывателя;
setSourceUrl(String): установить источник звука для этого проигрывателя в качестве url файла;
pause(): поставить проигрывание источника на паузу;
– и др. в документации.

Покопавшись в примерах из репозитория пакета, я нашёл достаточно много интересных наработок, чтобы собрать виджет-аудиоплеер.

Взял за основу PlayerWidget из примеров, но переделал вёрстку. Поправил метод _play(), написал метод getDurationString() для более корректного отображения таймеров плеера. Докрутил виджету слайдер громкости.

В итоге мы получаем удобный виджет аудиоплеера с рядом настроек для кастомной визуализации виджета ⚙️

Ознакомиться с форком пакета с моими дополнениями можно тут.

Надеюсь, будет полезно! Буду рад вашей обратной связи в чате.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥91
Обновления Flutter 3.16

Hola, Amigos! На связи Саша Чаплыгин, Flutter dev Amiga. Делимся с вами переводом статьи Kevin Chisholm, PM Dart и Flutter в Google о новой версии Flutter 3.16.

Что вас ждёт:
🟡 Material 3 устанавливается в качестве новой темы по умолчанию.
🟡 Отображается предварительный просмотр Impeller на Android.
🟡 Появилась возможность добавлять расширения для DevTools.
🟡 Обновился инструментарий Flutter для игр в стиле кэжуал.
🟡 И многое другое!

Читайте на Habr:
1 Часть
2 Часть

А если вы уже перешли на версию 3.16, то делитесь своими впечатлениями в чате!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🥱6🔥4👏3💩3🥴3
Как выбрать лучший инструмент для отслеживания крашей?

Hola Amigos! Crashlytics помогает собирать, анализировать и систематизировать отчеты о сбоях приложений. Полезный инструмент для оперативного устранения неполадок. Мы используем Firebase Crashlytics.

Преимущества Firebase Crashlytics

⚙️ Группирует сбои в удобный список, выделяя ключевые проблемы и предоставляя необходимую информацию для быстрого определения и решения основных причин.

⚙️ Предлагает рекомендации по устранению типичных проблем со стабильностью, облегчая процесс отладки и решения проблем.

⚙️ Ошибки приложения отображаются как события в аналитической системе, обеспечивая полный контекст и возможность отслеживания связанных событий.

⚙️ Временные уведомления о новых, критических или возрастающих проблемах обеспечивают быструю реакцию и устранение проблемы в реальном времени.

Как интегрировать Firebase Crashlytics во Flutter-проект описано в документации.

Есть и другие инструменты:

🔵Если вам нужны гибкие возможности конфигурации и поддержка множества языков, рассмотрите Sentry.io.
🔵Для тех, кто ищет расширенные функции отчетности и поддержку множества платформ — Bugsnag.
🔵Если ваш приоритет — взаимодействие с пользователями и сбор обратной связи, то Instabug.

Поделитесь своим опытом использования Crashlytics в чате! Какой инструмент выбрали для себя и почему?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92🔥1
Управление зависимостями в Flutter

Hola, Amigos! Сегодня мы поговорим о pubspec.yaml, в котором прописываются зависимости пакетов с помощью символа «^». Данный символ позволяет сделать «гибкую» зависимость, при которой мы охватываем сразу диапазон всех версий пакета, которые гарантированно обратно совместимы с указанной версией.

Преимущества «гибких» зависимостей:
1️⃣ Автоматически используем самую последнюю и лучшую версию пакета, если у нас всего одна зависимость.
2️⃣ Даем Dart'у возможность умно выбирать совместимую версию пакета среди других зависимостей.

Pubspec.lock — почему он важен?
Гарантирует, что каждый разработчик, заходящий в проект, использует те же версии библиотек, что и первый разработчик. Даже с символом «^», мы избегаем разночтений версий между разными устройствами.

Метаданные в pubspec.lock:
– Название пакета: для идентификации.
– Dependency: описывается, является ли сама эта зависимость прямой или транзитивной (зависимость для другой зависимости).
– Description: дополнительная информация о типе зависимости.
– Source: как зависимость была добавлена в проект.
– Version: конкретная версия пакета.

На этом всё! Делитесь в чате своими историями о работе с pubspec.yaml.
Please open Telegram to view this post
VIEW IN TELEGRAM
17👍5🔥3💩1
Интеграция видеоплеера YouTube во Flutter

Hola, Amigos! На связи Вова Зевеке, Flutter dev Amiga. Я долгое время работаю с проектом NL — международной торговой маркой. Больше всего она известна своими протеиновыми коктейлями и снеками.

Одной из моих задач было — интегрировать видеоплеер во Flutter- приложение, с которого можно было бы смотреть видео с YouTube. Казалось бы, нет ничего особенного, просто подключаем пакет, и все готово. Но я столкнулся с рядом проблем:

➡️ долгая загрузка видео,
➡️ некорректная перемотка видео,
➡️ аудио быстрее видео.

Обо всём подробно рассказал в статье. Делитесь в чате, был ли у вас подобный опыт, когда в простой задаче, на первый взгляд, оказалось много подводных камней.
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍4🔥1
Обзор adaptive_dialog

Hola, Amigos! Сегодня расскажем про #пп adaptive_dialog. Инструмент упрощает создание диалогов, предлагая заготовленные пресеты, которые автоматически стилизуются под Android и iOS.

С adaptive_dialog в вашем арсенале 6 удобных диалогов:

1️⃣ showOkAlertDialog (окно с кнопкой "OK");
2️⃣ showOkCancelAlertDialog (окно с кнопками "OK" и "Cancel");
3️⃣ showConfirmationDialog (окно с выбором итема из списка);
4️⃣ showModalActionSheet (окно-выплывашка снизу);
5️⃣ showTextInputDialog (окно с текстовыми полями);
6️⃣ showTextAnswerDialog (окно с текстовым полем формы "вопрос-ответ");

У всех видов диалоговых окон есть группа общих полей:

– title ([String] заголовок диалога);
– style ([AdaptiveStyle] стиль отображения диалога);
– builder ([Widget Function(BuildContext, Widget)] собственно, функция-билдер виджета);
– onWillPop ([Future<bool> Function()] функция, действующая при закрытии диалога);
– message ([String] текст диалога).

Также есть уникальные поля, расширяющие кастомизацию их функционала.

Переходите в чат и рассказывайте, пользовались ли вы пакетом adaptive_dialog и в каких проектах?
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍4🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Записки мобильного разработчика

Hola, Amigos! На связи Вова Зевеке, Flutter dev Amiga. Сегодня расскажем, как можно сделать запуск приложения с анимированным логотипом.

В основном файле main.dart устанавливаем SplashPage в качестве домашней страницы, чтобы приложение стартовало с анимированного логотипа.

void main() {
runApp(const MyApp());
}

class MyApp extends StatelessWidget {
const MyApp({super.key});

@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
useMaterial3: true,
),
home: const SplashPage(),
);
}
}


Далее создаем SplashPage с использованием TickerProviderStateMixin для управления анимациями. Инициализируем анимации в методе initState().

Future<void> playAnimation() async {
await Future.delayed(const Duration(milliseconds: 1000));
for (int i = 0; i < controllerColorOpacityList.length; i++) {
await controllerColorOpacityList[i].animateTo(1);
}
if (mounted) {
Navigator.of(context).pushReplacement(_createRoute());
}
}


И, наконец, реализуем анимированный переход между SplashPage и MainBottomNavigationBar с использованием PageRouteBuilder.

Route _createRoute() {
return PageRouteBuilder(
transitionDuration: const Duration(milliseconds: 700),
pageBuilder: (context, animation, secondaryAnimation) => const MainBottomNavigationBar(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const Offset begin = Offset(0.0, 1.0);
const Offset end = Offset.zero;

final Tween<Offset> tween = Tween(begin: begin, end: end);
final Animation<double> curvedAnimation = CurvedAnimation(
parent: animation,
curve: Curves.linear,
);

return FadeTransition(
opacity: curvedAnimation,
child: child,
);
},
);
}


На этом всё!

Ссылка github на код.

Делитесь в чате своими историями с анимациями, будет интересно почитать!
👍13🔥54
This media is not supported in your browser
VIEW IN TELEGRAM
AppLifecycle

Hola, Amigos! Сегодня с вами я, Саша Чаплыгин, Flutter dev Amiga. Предлагаю обсудить одну интересную тему — отслеживание состояния приложения: в фоне, закрыто или не активно.

Я написал статью, из которой вы поймете, как обрабатывать переходы в новое состояние. Узнаете 2 подхода к реализации, которые могут выручить в той или иной ситуации.

Читайте на Habr и делитесь своим опытом работы с жизненным циклом приложения в чате ⚙️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍172🔥21
Полезные посты и статьи января, которые вы могли пропустить

Hola, Amigos! Вот и дайджест января. Уже целый месяц нового года прошел!

🔵Видео-лекции с DevFest 2023
🔵Flutter 3.16 (часть 1)
🔵Flutter 3.16 (часть 2)
🔵Анимация и Flutter
🔵Интеграция видеоплеера во Flutter
🔵Жизненный цикл приложения

А еще напоминаем, что обзоры полезных пакетов вы можете найти по тэгу #пп.

Выбирайте, что вам интересно и переходите по ссылкам.

Рассказывайте в чате, как начался ваш 2024-ый? И какими проектами вы сейчас увлечены?
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6💘3🔥2💩1
Советы от Team Lead для подготовки к первому собеседованию

Hola, Amigos! На связи Сережа Климович, Mobile Team Lead Amiga. Сегодня вернемся к теме собеседований, хочу вам дать несколько советов от себя и напомнить о рекомендациях нашей Group Lead HR, Кати. Берите на вооружение!

Начну с того, что у начинающих мобильных разработчиков есть несколько грейдов: «стажер», «junior» и «junior+». В зависимости от скиллов будут меняться требования к сотруднику и условия сотрудничества.

Оценивайте свои знания и умения трезво, не стыдно чего-то не знать. А некоторые компании, и мы в том числе, готовы обучать и «выращивать» сотрудников.

Что должен знать даже стажер?

🟡Минимально в Dart: типы данных и переменные, функции, классы, Control flow statement, примитивные структуры, литералы, print, понимание null safety.
🟡В Flutter: runApp, MaterialApp, Scaffold, Align, Container, Flex, Expanded, Spacer, ListView, Text, простая навигация между двумя экранами, разница между Stateless и Stateful виджетами.
🟡Уметь устанавливать и настраивать IDE, dart и flutter для разработки.
🟡Понимать суть работы удаленных репозиториев Git (GitHub / GitLab).

Junior должен знать всё, о чем я написал выше. Плюс:

⭕️Иметь практический опыт основ объектно-ориентированного и асинхронного программирования.
⭕️Понимать механизм управления локальным состоянием. Знание виджетов для верстки экранов, способов взаимодействия с пользователем (кнопки, жесты и т.п.).
⭕️Базовое управление проектами. Обязательно: Pub и pub.dev, pubspec.yaml.
⭕️Уметь взаимодействовать с git через IDE.
⭕️Понимать HTTP запросы, например get/post.
⭕️Знать форматы запросов и ответов, например JSON и пакет json_serializable.

С таким набором скиллов, я думаю, у вас точно есть все шансы получить свою первую работу! И не забывайте, что личные качества тоже имеют большое значение. Будьте честными и открытыми. Успехов!

Если вам интересна эта тема и есть вопросы, то пишите в чат. Пообщаемся 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5🤡3💘31🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
Анимация и Flutter

Hola, Amigos! Меня зовут Сергей Климович, Mobile Team Lead агентства заказной разработки Amiga. В мире мобильной разработки Flutter выделяется своей гибкостью и простотой в создании красивых пользовательских интерфейсов.

Однако, чтобы добавить дополнительные визуальные эффекты и повысить уровень графической привлекательности приложения, иногда необходимо выходить за рамки стандартных возможностей. И в этом нам помогают шейдеры ⚙️

Шейдеры предоставляют возможность создавать сложные визуальные эффекты, изменять внешний вид элементов интерфейса и даже реализовывать анимации, которых было бы трудно достичь с использованием обычных методов.

В новой статье рассказываю, как использовать шейдеры в приложениях Flutter, открыв новые горизонты для креативной реализации дизайнерских идей ⚙️

Всем хорошего кода! Делитесь в чате своим опытом работы с анимацией в Flutter.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥15👍42🤷‍♂2👏1
Home Widget для Android

Hola, Amigos! На связи Вова Зевеке, Flutter dev Amiga. Сегодня расскажем, как сделать виджет HomeScreen с помощью пакета home_widget.

Для приложения на Android создадим макет виджета внутри android/app/src/main/res/layout. Нажимаем правой кнопкой мыши на папку android, выбираем Flutter/Open Android module in Android Studio. В новом окне нажимаем правой кнопкой мыши на app, выбираем New/Widget.

Сгенерируется несколько файлов для редактирования. Один из них — файл конфигурации виджета (расположен в android/app/src/main/res/xml). Ещё один файл – сам макет виджета (расположен в android/app/src/main/res/layout).

Обратите особое внимание в коде ниже на строчку android:id="@+id/firstString". Тут мы выдали тексту id-шник, который нам понадобится позже.

</RelativeLayout
<TextView
android:id="@+id/firstString"
… />
</RelativeLayout>


Также в AndroidManifest.xml у нас появился ресивер.

<receiver
android:name=".HomeWidgetTextTable"…
</receiver>


Нам осталось настроить передачу данных между нашим Flutter-приложением и HomeWidget. Для этого в файле android\app\src\main\java\com\example\sandbox\HomeWidgetTextTable.kt импортируем плагин и пишем код обновления HomeWidget.

class HomeWidgetTextTable : AppWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
}
}

internal fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int
) {
val widgetData = HomeWidgetPlugin.getData(context)
val firstString = widgetData.getString("firstString", null)
val views = RemoteViews(context.packageName, R.layout.home_widget_text_table)
views.setTextViewText(R.id.firstString, firstString)

appWidgetManager.updateAppWidget(appWidgetId, views)
}


Теперь создаем TextField и набираем текст, отображаемый в HomeWidget.

  @override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((timeStamp) {
HomeWidget.initiallyLaunchedFromHomeWidget().then((value) async {
updateUI();
});
});
super.initState();
}

void updateUI() {
var text = controller.text;
HomeWidget.saveWidgetData<String>('firstString', text);
HomeWidget.updateWidget(
//name: 'TextTable',
androidName: 'HomeWidgetTextTable',
iOSName: 'HomeWidgetTextTable',
);
}

@override
Widget build(BuildContext context) {
return Column(
children: [
TextField(
controller: controller,
style: const TextStyle(
color: Colors.white,
),
onChanged: (value) {
updateUI();
},
),
const SizedBox(height: 16),
],
);
}
}


Как мы видим, созданный нами метод updateUI отвечает за передачу новых данных HomeWidget.

Ставьте реакцию, если было полезно!
👍378💘3
Обзор scroll_to_index

Hola, Amigos! Сегодня рассмотрим #пп scroll_to_index. Данный пакет облегчает управление скроллом у прокручиваемых наборов виджетов. Для этого нам нужно дочерние виджеты у скроллящегося списка обернуть в новый виджет AutoScrollTag.

Благодаря этому виджету, мы можем управлять поведением скролла через контроллер. А именно, проскроллить лист до нужного нам итема по индексу:

autoScrollController
.scrollToIndex(30, preferPosition: AutoScrollPosition.begin); //где 30 - это index у AutoScrollTag.


Настройки пакета:
– key ([Key] ключ виджета);
– controller ([AutoScrollController] контроллер, через который мы можем управлять прокруткой);
– index ([int] индекс виджета в скроллящемся списке);
– color ([Color?] цвет фона у дочернего виджета);
– highlightColor ([Color?] тоже должен был как-то влиять на визуал дочернего виджета, но изменений мы не обнаружили);
– disabled ([bool] включает/выключает контроллер для этого дочернего виджета);
– builder ([Widget Function(BuildContext, Animation<double>)?] билдер виджета);
– child ([Widget?] дочерний виджет).

Расскажите в чате использовали ли вы scroll_to_index в своих проектах? ⚙️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🍓3🔥2💘2