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

Глобальные функции или как вызвать функцию, которая находится на другом экране

Thunkable X  
09.11.2019

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

В Thunkable X есть глобальные переменные, но глобальных функций нет. Однако, существуют компоненты, к методам которых можно обращаться на любом экране. Отсюда и возникла мысль найти глобальный компонент, в теле которого можно вызвать локальную функцию. В качестве такого компонента подойдёт Timer: на одном экране таймер запускается, а на другом размещается блок обработки его срабатывания, в котором происходит вызов нужной функции или метода компонента. В последнем случае появляется возможность вызывать методы компонентов, которые находятся на другом экране и даже создавать компоненты. Но это возможно только в том случае, если неактивный экран, на котором находится глобальная функция, существует на момент её вызова. Для этого нужно либо открыть этот экран, либо использовать компонент навигации при помощи вкладок, в котором все экраны инициализируются в момент запуска приложения.

Для передачи данных в блок обработки срабатывания таймера можно использовать свойства глобальных компонентов или глобальные переменные. Например, данные можно передать при помощи самого компонента таймера путём добавления в него нового свойства Message из класса Alert. Для возврата данных потребуется второй таймер с аналогичным использованием блоков запуска таймера и обработки его срабатывания.

Блоки для экрана с функцией выглядят следующим образом.

Экран с функцией

Блоки для вызова функции с другого экрана.

Экран для вызова глобальной функции

Выпадающий список свойств в блоках any set и get определяется выбранным типом компонента, а не самим компонентом. Если бы в качестве типа был выбран Timer, то в этом списке отображались бы свойства для компонентов Timer, но в качестве типа указан Alert, что и позволило добавить компоненту Timer1 новое и более подходящее по названию свойство Message.

Для передачи данных между экранами в качестве типа необходимо выбрать тип глобального компонента. Типы компонентов интерфейса - Button, Label, Switch и другие - не подойдут из-за их локальной области действия.

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

Показанный механизм помогает частично решить ещё одну проблему - резкое падение скорости работы редактора блоков при определённом количестве блоков на экране. В разных ситуациях данное падение скорости наблюдается при разном количестве блоков на экране, но в среднем принято считать, что ощутимое замедление работы редактора блоков происходит при наличии 200-300 блоков на экране. Единственным способом качественно ускорить работу редактора боков является уменьшение числа блоков, особенно "тяжелых" блоков инициализации глобальных переменных и блоков any component.

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

Thunkable X  
© 2016-2018 Александр Страшко