DroidScript
DroidScript
инструменты для мобильной разработки

Типы переменных

Базовый курс программирования на Thunkable X  
08.10.2019

Использование переменных в Thunkable X имеет ряд особенностей и нюансов, включая и само понятие типа переменной.

Глобальные переменные

Блоки app, stored и cloud называются глобальными, потому что они доступны на любом экране приложения. Если на экране Screen1 глобальной переменной appmyVar присвоено значение 10, то на любом экране можно получить или изменить это значение при помощи блока переменной appmyVar. Для изменения значения глобальной переменной необходимо в блоке переменной в точности указать её тип и имя. appmyVar и stored myVar – разные переменные. У них не совпадает тип блока.

App-переменные предназначены для обмена данными между экранами. Их значения хранятся в оперативной памяти устройства и доступны только во время выполнения приложения. После закрытия приложения значение app-переменных будет потеряно. Для сохранения данных после завершения работы приложения и их повторного использования при следующем запуске приложения используются переменные stored или cloud.

Значение stored-переменной хранится на устройстве, а cloud – в облачной базе данных Firebase на аккаунте разработчика. Существует вероятность того, что эта база время от времени будет очищаться, что приведёт к удалению значений переменных. По этой причине рекомендуется использовать свой аккаунт Firebase. Для этого в проекте необходимо заполнить поля доступа к своей базе Firebase, после чего облачные переменные автоматически станут работать с ней.

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

Облачная переменная с блоком прослушивания

Блок прослушивания появится в палитре Variables после добавления cloud-переменной. на экран. Выполнение содержимого этого блока будет происходить независимо от того, где это изменение происходит, в самом приложении или в консоли Firebase. Это можно использовать для отправки новостей или уведомлений пользователям прямо из консоли Firebase. Если приложение открыто, то изменение данных моментально будет отслежено блоком прослушивания. Если приложение закрыто, то блок прослушивания обнаружит изменение значения узла после очередного запуска приложения.
Блок прослушивания срабатывает не только при изменении переменной, но и при её инициализации, о чём нужно помнить.

Блок прослушивания осуществляет прослушивание изменения значений всех дочерних узлов для выбранного узла. Например, если узел name2 содержит узел “0”, в котором находится узел “00”, то изменение значения узла ”00” приведёт к срабатыванию блока слушателя. Это не позволяет определить узел, в котором произошло изменение значения, если он имеет сложную структуру. Для определения узла, в котором произошло изменение, необходимо в cloud-переменной в точности указать путь к нему или использовать блок прослушивания компонента Realtime DB.

При изменении значения узла блок слушателя может сработать несколько раз. Если вам требуется только одно срабатывание, то для этого необходимо использовать защёлку –переменную, которая будет изменять своё значение только при первом срабатывании за выбранный интервал времени.
При помощи блока прослушивания можно легко создать чат. Сообщения записываются в общую переменную с прослушиванием. При изменении данных вызывается блок прослушивания, внутри которого срабатывают блоки для добавления сообщения на экран.

Stored-переменные не имеют блока для прослушивания и используются для сохранения персональной информации на устройство пользователя. Например, чтобы пользователь каждый раз не вводил логин и пароль для доступа к базам данных и web-сервисам, их сохраняют в stored-переменных. Thunkable X не позволяет создавать файлы, но вместо файлов можно использовать stored-переменные для сохранения настроек приложения и других данных, которые не предназначены для других пользователей.

Переменные функции

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

Переменные функции

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

Переменные функции в Thunkable X имеет ссылочный тип, чем принципиально отличаются от глобальных переменных app, stored и cloud. Ссылочный тип означает то, что в случае присоединения к этой переменной блока объекта, произойдёт сохранение в переменной не копии этого объекта, а его адреса в памяти – ссылки на объект. Предположим, есть объект data, в котором хранятся имена и электронные адреса пользователей. Если блок этого объекта присоединить к переменной функции, то значением переменная функции будет не объект, а его адрес в оперативной памяти, например, 0000 0000 0010 0001. В этом случае переменная функции является ссылкой (указателем) на объект и они становятся как бы связанными друг с другом верёвкой. Если изменить свойства объекта в переменной функции, то это приведёт к автоматическому изменению свойств исходного объекта, на который она указывает. Если изменить свойства исходного объекта, то это автоматически приведёт к изменению свойств объекта в переменной функции, которая указывает на него. А можно ли разорвать это связь? Можно. Для этого к блоку переменной функции достаточно присоединить любой другой блок с числом, строкой и др.

Если же блок объекта присвоить переменной типа app, stored или cloud, то при этом в этих переменных будет сохранена копия объекта, и её изменение никак не повлияет на исходный объект, а изменение исходного объекта никак не повлияет на уже существующую его копию.

Ниже показан пример, в котором после изменения имени второго объекта из списка на Steve, произойдёт его изменение в списке refList, но не списке app objectList. Это происходт по той причине, что блок refObjectявляется ссылкой на второй объект из списка refList. Изменение свойства этого блока приводит к изменению свойства исходного объекта в списке.

Пример “Ref and copy”.

Демонстрация использования ссылок на объект и копии объекта

В блоке app copyObject содержится копия объекта, изменение свойства которого никак не влияет на объект в списке. Если необходимо заменить объект в списке на его копию, то необходимо перезаписать объект в списке на его копию.

Ссылки нужны для увеличения эффективности работы приложений. Копирование объектов – это достаточно медленная операция, которая требует ещё много памяти для хранения копий объектов (об этом мы поговорим позже). Попробуйте создать 200 копий кнопок при помощи блока Any clone, чтобы увидеть то, сколько времени эта операция требует даже на современных и мощных телефонах. Для копирования объекта нужно выделить место в памяти и скопировать все его данные. А при использовании ссылок ничего этого не требуется, потому что ссылка – это переменная, в которой хранится адрес объекта, а не он сам. По этой причине, например, сортировка ссылок выполняется намного быстрее сортировки объектов.  Вы замечали, как быстро можно переместить группу файлов в проводнике из одной папки раздела диска в другую папку на том же разделе диска и как медленно они будут копироваться с диска на другой диск или флешку? Это происходит потому, что в первом случае происходит работа с ссылками, а во втором происходит копирование данных файла.

Локальные переменные

Локальные переменные доступны  только внутри блока, к которому присоединены соответствующие им светло-зелёные блоки. За пределами этого блока данные переменные будут возвращать значение undefined (неопределенно).

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

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

Базовый курс программирования на Thunkable X  
© 2016-2018 Александр Страшко