Flutter 2. Что нового

3 марта 2021 в рамках мероприятия Flutter Engage была представлена новая версия фреймворка — Flutter 2. И это действительно мажорный апдейт! Вместе с новой версией Flutter вышла и новая версия Dart 2.12, которая принесла весьма ожидаемый null safety (ура!). Это настолько крутая фича, что язык тоже заслуживал бы мажорной версии, но разработчики специально не стали этого делать, т.к. новая версия не нарушает обратной совместимости (!).

Для того, чтобы рассказать что нового во Flutter 2 и Dart 2.12, я записал видео. Приятного просмотра!

Читать →

(Вредные) советы для разработки на Flutter

Недавно я наткнулся на статью Tips for Coding with Flutter. И не просто где-то в самом темном закоулке Интернета, а прямо Medium мне прислал ее в подборке, в качестве рекомендации. Т.е. статья весьма популярна и её прочитает много разработчиков, в том числе и начинающих.

Я начал читать и то, что я увидел — мне совсем не понравилось. Некоторые советы действительно хорошие, но некоторые — весьма спорные. Давайте пойдем по порядку.

Именование

Naming Convention

Libraries, packages, directories, and source files should be in lowercase with underscores in between words like this:

library dart_dynamic_links;
import 'socket/socket_manager.art';

Classes, enums, extension names, and typedefs should start in uppercase like this :

class MainSection {...}
enum ItemSelectionTemp {...}
extension MyList<F> on List<F> {...}
typedef Definition<D> = bool function(D value);

Constants, variables, parameters, and named parameters should start with lowercase then the other words start with uppercase just like this example:

const magazinePrice = 4.20;
var itemsOfSchools;
final urlPlacement = RegExp(‘^([a-z]+):');
void magSum(int magazinePrice) {...}

Здесь лучше всего просто придерживаться официальных рекомендаций 

https://dart.dev/guides/language/effective-dart/style 

https://dart.dev/guides/language/effective-dart/design#names

Там описание более полное, с корректными примерами и пояснениями. В отличие от того, что мы видим в статье.

Следующий совет: «Указывайте тип для членов класса»

Specify Types for Classes Members

It’s important that you always specify the type of member when the values are known. You should avoid using var when possible.

int days = 22;
final vehichle car = vehichle();
String name = 'Kevin';
const int timeUntilEnd = 120;

С приведенными примерами указание типа не имеет смыла, об этом и говорится в Effective Dart. Тип нужно указывать когда он не очевиден, а что хорошего в дублировании одного и того же слова в строчке final Vehichle car = Vehichle();  – решительно не понятно.

Читать →

Исправляем артефакты на экране запуска в Android

Пробуем новый формат видео: в серии How To Fix It мы будем делиться решением проблем, с которыми сталкиваемся в процессе разработки.

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

Разработка Flutter — плагина под Android

Доброго времени суток! Flutter, имеет большое коммьюнити, огромное множество пакетов и плагинов, но всего не предусмотришь и, рано или поздно, разработчик сталкивается с задачей написания своего плагина, и сегодня рассмотрим как это сделать. Для примера возьмем несложный, но включающий многие аспекты разработки, плагин шаринга из приложения.
Читать →

Работа в фоне: iOS, Android, Flutter

Рано или поздно перед каждым мобильным разработчиком встает задача выполнить некоторую работу в фоне. Это может быть периодическая предварительная загрузка свежих материалов с сервера, синхронизация данных,  оптимизация работы локальной базы данных, необходимость завершить работу, начатую пользователем, взаимодействие с внешними аксессуарами, отслеживание геопозиции и многое другое. Как говорится, была бы возможность, а уж как ей воспользоваться, придумать не проблема. Если говорить о работе в фоне на десктоп платформах, то очевидно, что никаких проблем с этим там нет, разве что глаза разбегаются от разных возможностей реализации: начиная с запуска процесса в безоконном режиме, заканчивая реализацией служб или даже, при острой необходимости, драйверов. Одним словом, раздолье. В то же время мобильные платформы не могут похвастаться таким разнообразием. Оно и понятно: мобильность накладывает жесткое ограничение (емкость современных батарей, при учете прожорливости ОС и остального софта, оставляет желать лучшего).

Давайте рассмотрим основные возможности, которые нам предоставляют мобильные платформы в плане работы в фоне.

Читать →

Вы все еще эмулируете? Тогда мы идём к вам…

Скорость (да и качество) разработки прямо пропорциональна отзывчивости  и плавности системы, на которой эта самая разработка и ведется. Большинство мобильных разработчиков ежедневно на протяжении всего рабочего времени использует эмуляторы мобильных операционных систем. С одной стороны, эмуляторы позволяют значительно сократить  время в том плане, что при использовании эмулятора экономия происходит за счет ненужности заливки разрабатываемого приложения на реальное устройство, последующей его установки и запуска. А с другой стороны, эти же эмуляторы пожирают системные ресурсы, да порой так яростно, что о продуктивной работе речь вообще не идет. Самое время поговорить о том, можно ли что-то улучшить в подобной ситуации или нет. Если вы тоже задавались подобным вопросом, то добро пожаловать под кат.

Читать →

Вход через VK.com во Flutter приложении

В этой статье я попытаюсь дать подробные инструкции по подключению авторизации через ВКонтакте в ваше Flutter приложение.

Вход осуществляется с помощью VK SDK. Для добавления SDK в приложение будем использовать плагин flutter_login_vk с pub.dev. Плагин поддерживает iOS и Android.

Итак, начнем. Установите последнюю версию плагина для логина через VK, как указано на вкладке «Installing». Теперь можно двигаться дальше, для начала нам нужно создать приложение на VK.com.

Читать →

Локализация Dart пакетов

При разработке пакета может возникнуть потребность добавить локализацию. Если вы используете для локализации пакет Intl, то вас ждёт неприятный сюрприз.

Проблема

Для того, чтобы реализовать Intl локализацию стандартным образом вы должны:

  • создать класс, содержащий строки для локализации, получаемые через Intl.message();
  • сгенерировать arb файлы на основе этого класса;
  • выполнить перевод и разместить arb файл для каждого языка;
  • сгенерировать код ( messages_*.dart файлы) на основе arb файлов;
  • объявить делегат локализации (который будет зарегистрирован в приложении) и реализовать функцию загрузки, которая выполнит initializeMessages()  из сгенерированного кода и вернёт экземпляр класса реализации.

Этот способ отлично работает в приложении, но имеет одно существенное ограничение: правильно обработан будет только первый вызов initializeMessages(). Все последующие вызовы не добавят строк в локализацию, если для указанной локали уже есть записи.

Читать →

#4 Советы Flutter + Dart

Перевод статьи #4 Flutter + Dart Tips.

Это статья #4 в серии переводов Советы Flutter + Dart. Если вы пропустили предыдущие статьи, то вы сможете найти их по ссылкам:

11. Использование множественного числа в ваших Dart строках

В разных языках действуют разные правила грамматики для количеств. В английском, например, количество 1 — особый случай. Пишется «1 book», а для любого другого количества будет «n books». Это отличие между единственным и множественным достаточно общее, но другие языки имеют более тонкие различия.

Вы можете использовать множественное число в Dart строках, используя пакет Intl. Полный набор, поддерживаемый этим пакетом: ноль, один, два, несколько, много и другие.

  • Добавляем зависимость:
  • Как использовать:
  • Вывод:

Читать →

#3 Советы Flutter + Dart

Перевод статьи #3 Flutter + Dart Tips.

На нашем блоге публикуется перевод серии статей с очень помогающими нам при работе во Flutter и с Dart советами, которыми делится Flutter коммьюнити и сам автор,

Это статья #3 в данной серии, если вы пропустили предыдущие статьи, то вы сможете найти их по ссылкам:

7. Хотите использовать отдельную Theme для конкретного виджета?

Просто оберните этот виджет в виджет  Theme и передайте ThemeData(). Совет от Sahil Kumar.

Читать →