Flutter: обновление виджета одного класса из другого класса

Задача: в одном из фоново работающих классов (WebSocket клиент) изменилось значение отображаемое в другом классе. Необходимо вызвать setState для изменившегося виджета

Решение: воспользуемся классом StreamController. По сути это «конвеер», в который можно что-то ложить и объявлять «слушателя», который будет что-то делать если в «конвеер» попадет какое-либо значение.

Объявим в глобальных переменных контроллер, «конвеера»:

Далее в классе ИЗ которого нужно сообщить что что-то изменилось, ложим в «конвеер» данные:

А в классе, который должен отображать изменения, объявим «слушателя» в initState:

Не забудем при выходе из класса, убить подписку:

Flutter: периодический таймер

Во Flutter за таймеры отвечает класс Timer, а за периодический в частности Timer.periodic

Для примера использования, реализуем отчет переменной от 30 до 0:

Flutter: чтение файла из ресурсов

Это возможно при использовании класса rootBundle. Для начала необходимо разместить файл в папку проекта. Далее в pubspec.yaml в секцию assets добавить ссылку на файл вида:

И далее в коде оформить загрузку файла:

Flutter: как убрать полоски при выходе за рамки контейнера виджета?

Чаще всего такие полоски появляются при появлении экранной клавиатуры в поле ввода или при выходе элементов виджета за видимые поля, например текста. Избежать этого, можно обернув большой виджет в виджет SingleChildScrollView:

В результате получится намного приятнее:

Flutter: рисуем форму авторизации с маской ввода

Задача: нарисовать форму ввода телефона для авторизации, с учётом маски и проверкой корректности ввода номера. Должно получиться что-то вроде:

Решение:

Для накладывания маски на TextFormField воспользуемся пакетом flutter_multi_formatter:

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

Саму кнопку нарисуем как:

Переключение флажка будем делать, отслеживая введенный текст:

1 2 3 4 5 9