При разработке мобильных приложений может возникнуть необходимость использовать одну и ту же функцию на нескольких экранах. Традиционно эта задача решается путём копирования блоков функции с одного экрана на другой. Ничего сложного, но при этом возникают дублирующиеся блоки. Попробуем устранить этот недостаток при помощи глобальных функций.
В Thunkable X есть глобальные переменные, но глобальных функций нет. Однако, существуют компоненты, к методам которых можно обращаться на любом экране. Отсюда и возникла мысль найти глобальный компонент, в теле которого можно вызвать локальную функцию. В качестве такого компонента подойдёт Timer: на одном экране таймер запускается, а на другом размещается блок обработки его срабатывания, в котором происходит вызов нужной функции или метода компонента. В последнем случае появляется возможность вызывать методы компонентов, которые находятся на другом экране и даже создавать компоненты. Но это возможно только в том случае, если неактивный экран, на котором находится глобальная функция, существует на момент её вызова. Для этого нужно либо открыть этот экран, либо использовать компонент навигации при помощи вкладок, в котором все экраны инициализируются в момент запуска приложения.
Для передачи данных в блок обработки срабатывания таймера можно использовать свойства глобальных компонентов или глобальные переменные. Например, данные можно передать при помощи самого компонента таймера путём добавления в него нового свойства Message из класса Alert. Для возврата данных потребуется второй таймер с аналогичным использованием блоков запуска таймера и обработки его срабатывания.
Блоки для экрана с функцией выглядят следующим образом.
Блоки для вызова функции с другого экрана.
Выпадающий список свойств в блоках any set и get определяется выбранным типом компонента, а не самим компонентом. Если бы в качестве типа был выбран Timer, то в этом списке отображались бы свойства для компонентов Timer, но в качестве типа указан Alert, что и позволило добавить компоненту Timer1 новое и более подходящее по названию свойство Message.
Для передачи данных между экранами в качестве типа необходимо выбрать тип глобального компонента. Типы компонентов интерфейса - Button, Label, Switch и другие - не подойдут из-за их локальной области действия.
Глобальные функции (или межэкранный вызов функций, как это также можно назвать) можно использовать для предварительной загрузки ресурсов и придать экрану-заставке практический смысл, чтобы он закрывался после загрузки ресурсов в приложение, а не по таймеру.
Показанный механизм помогает частично решить ещё одну проблему - резкое падение скорости работы редактора блоков при определённом количестве блоков на экране. В разных ситуациях данное падение скорости наблюдается при разном количестве блоков на экране, но в среднем принято считать, что ощутимое замедление работы редактора блоков происходит при наличии 200-300 блоков на экране. Единственным способом качественно ускорить работу редактора боков является уменьшение числа блоков, особенно "тяжелых" блоков инициализации глобальных переменных и блоков any component.
К сожалению, данное решение не позволяет на неактивном экране обращаться к свойствам компонентов UI активного экрана. Передать ссылку на компонент можно, но вызов метода вернёт значение undefined.