Null safety в Dart — подробный разбор

Подробно разбираемся с Null Safety в языке Dart.

Из этого видео вы узнаете:

  • Проблема: зачем нужен null safety.
  • Что такое sound null safety?
  • Как меняется система типов в Dart c введением null safety.
  • Что добавилось в синтаксисе и какие новые ключевые слова появились в языке
  • Как выполнить миграцию вашего проекта или пакета на null safety.

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();  – решительно не понятно.

Читать →

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

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

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

Читать →

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

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

Читать →

Локализация 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.

Читать →

#2 Советы Flutter + Dart

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

Вторая часть из серии советов по Flutter и Dart.

Вот первая часть советов, если вы ее пропустили: #1 Советы Flutter + Dart.

Сегодня новая порция советов, частью — от автора, но также было получено много хороших советов от коммьюнити.

Ниже вторая часть советов:

4. Используйте стили из тем в виджете  Text

Если вы Android разработчик, вы должны были использовать  android:textAppearance  в ваших TextView и использовали  @style/TextAppearance.AppCompat.Body1 и так далее.

Для тех, кому это ничего не говорит: речь идет о заранее настроенном стиле, который позволяет вам стилизовать ваш Text в терминах Material гайдлайна как Title, Body, Caption и т.д.

Итак, как вам реализовать это во Flutter Text виджете?

Это просто, как и все во Flutter. ?

Вам просто нужно передать свой стиль textTheme используя  Theme.of(context).textTheme.

Ниже пример кода.

Читать →

#1 Советы Flutter + Dart

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

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

Это статья посвящена советам по использованию Dart и Flutter, и является частью цикла статей, целью которых является изложение всех советов по Flutter и Dart, которые открыл для себя автор. Все советы также можно найти на репозитории «FlutterDartTips» на Github.

Ниже первая часть советов:

1. Использование null-aware операторов

Когда требуется проверить на null значения в Dart — используйте null-aware  операторы, чтобы уменьшить количество кода, требующегося, чтобы работать с ссылками, которые потенциально могу быть null .

Читать →