Переменные

Чтобы использовать переменные, объявите их в отдельном блоке variables. При объявлении переменной укажите параметры:

  • name — имя, может состоять из латинских букв разных регистров, цифр и символов _ и .. Не может начинаться с цифры или с точки.
  • type — тип переменной. См. Типы данных.
  • value — значение по умолчанию.

Например:

{
    "variables": [
        {
            "name": "subscribed",
            "type": "boolean",
            "value": true
        }
    ],
}

Типы данных

Поддерживаемые типы данных:

  • логический: boolean
  • строковый: string
  • целочисленный: integer
  • число с плавающей точкой: number
  • цвет: color
  • ссылка на ресурс: url (должен быть корректным URL)
  • словарь: dict
  • массив: array
  • свойство: property, см. Свойства
Примеры объявления переменных
{
    "variables": [
        {
            "name": "subscribed",
            "type": "boolean",
            "value": true
        },
        {
            "name": "likes",
            "type": "integer",
            "value": 0
        },
        {
            "name": "black",
            "type": "color",
            "value": "#f000"
        },
        {
            "name": "username",
            "type": "string",
            "value": "unknown"
        }
    ],
    "states": [ ... ]
}

Выражения при инициализации переменных

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

Пример выражения при инициализации переменных
{
  "variables": [
    {
      "name": "margin",
      "type": "integer",
      "value": 8
    },
    {
      "name": "padding",
      "type": "integer",
      "value": "@{margin * 2}"
    },
    {
      "name": "total_spacing",
      "type": "integer",
      "value": "@{margin + padding}"
    }
  ]
}

Важно

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

Словари

В качестве переменной можно объявлять словари — произвольные JSON-объекты, внутри которых могут храниться любые другие типы переменных.
Например, их удобно использовать для объявления палитры и получать из нее значения в зависимости от темы приложения:

"variables": [
  {
    "name": "palette",
    "type": "dict",
    "value": {
      "light": {
        "text_color": "#ffffff",
        "text_background": "#0077FF"
      },
      "dark": {
        "text_color": "#000000",
        "text_background": "#0077FF"
      },
      "big": {
        "text_size": 20
      },
      "small": {
        "text_size": 16
      }
    }
  },
  {
    "name": "app_theme",
    "type": "string",
    "value": "light"
  },
  {
    "name": "font_size",
    "type": "string",
    "value": "small"
  }
]

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

getIntegerFromDict(dict_name, path_to_value)
getNumberFromDict(dict_name, path_to_value)
getStringFromDict(dict_name, path_to_value)
getColorFromDict(dict_name, path_to_value)
getUrlFromDict(dict_name, path_to_value)
getBooleanFromDict(dict_name, path_to_value)
getOptIntegerFromDict(fallback, dict_name, path_to_value)
getOptNumberFromDict(fallback, dict_name, path_to_value)
getOptStringFromDict(fallback, dict_name, path_to_value)
getOptColorFromDict(fallback, dict_name, path_to_value)
getOptUrlFromDict(fallback, dict_name, path_to_value)
getOptBooleanFromDict(fallback, dict_name, path_to_value)

В объявленном словаре из примера значения цветов и размера шрифта можно использовать так:

"background": [
  {
    "type": "solid",
    "color": "@{getColorFromDict(palette, app_theme, 'text_background')}"
  }
],
"font_size": "@{getIntegerFromDict(palette, font_size, 'text_size')}",
"text_color": "@{getColorFromDict(palette, app_theme, 'text_color')}"
Посмотреть интерактивный пример

Массивы

Массивы содержат произвольные JSON-объекты.

"variables": [
  {
    "type": "array",
    "name": "array",
    "value": [
      "string",
       123,
      "@{expression}"
    ]
  }
]

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

getIntegerFromArray(array, index)
getNumberFromArray(array, index)
getStringFromArray(array, index)
getColorFromArray(array, index)
getUrlFromArray(array, index)
getBooleanFromArray(array, index)
getArrayFromArray(array, index)
getDictFromArray(array, index)
getOptIntegerFromArray(array, index, fallback)
getOptNumberFromArray(array, index, fallback)
getOptStringFromArray(array, index, fallback)
getOptColorFromArray(array, index, fallback)
getOptUrlFromArray(array, index, fallback)
getOptBooleanFromArray(array, index, fallback)
getOptArrayFromArray(array, index, fallback)
getOptDictFromArray(array, index, fallback)

len(array)

Если тип функции выбран неправильно или произошел выход за границы массива, возникнет ошибка. В этом случае можно использовать функцию getOpt* вместо get*, тогда вместо ошибки возвратится fallback значение.

Посмотреть интерактивный пример

Методы

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

Доступные методы

Название

Описание

Тип результата

string.toString()

Возвращает строковое представление заданного значения.

string

number.toString()

Возвращает строковое представление заданного значения.

string

boolean.toString()

Возвращает строковое представление заданного значения.

string

color.toString()

Возвращает строковое представление заданного значения.

string

url.toString()

Возвращает строковое представление заданного значения.

string

array.toString()

Возвращает строковое представление заданного значения.

string

dict.toString()

Возвращает строковое представление заданного значения.

string

array.getArray(integer)

Возвращает значение массива из массива по позиции.

array

array.getBoolean(integer)

Возвращает логическое значение из массива по позиции.

boolean

array.getColor(integer)

Возвращает значение цвета из массива по позиции.

color

array.getDict(integer)

Возвращает значение словаря из массива по позиции.

dict

array.getInteger(integer)

Возвращает целочисленное значение из массива по позиции.

integer

array.getNumber(integer)

Возвращает числовое значение из массива по позиции.

number

array.getString(integer)

Возвращает строковое значение из массива по позиции.

string

array.getUrl(integer)

Возвращает значение URL из массива по позиции.

url

array.isEmpty()

Метод возвращает логическое значение true, если массив пуст, иначе false.

boolean

array.filter(function)

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

array

dict.getArray(vararg string)

Возвращает значение массива из словаря по ключу.

array

dict.getBoolean(vararg string)

Возвращает логическое значение из словаря по ключу.

boolean

dict.getColor(vararg string)

Возвращает значение цвета из словаря по ключу.

color

dict.getDict(vararg string)

Возвращает значение словаря из словаря по ключу.

dict

dict.getInteger(vararg string)

Возвращает целочисленное значение из словаря по ключу.

integer

dict.getNumber(vararg string)

Возвращает числовое значение из словаря по ключу.

number

dict.getString(vararg string)

Возвращает строковое значение из словаря по ключу.

string

dict.getUrl(vararg string)

Возвращает значение URL из словаря по ключу.

url

dict.containsKey(string)

Возвращает true, если данный ключ присутствует в словаре.

boolean

dict.isEmpty()

Метод возвращает логическое значение true, если словарь пуст, иначе false.

boolean

dict.getKeys()

Возвращает коллекцию, содержащую только ключи словаря.

array

dict.getValues()

Возвращает коллекцию, содержащую только значения словаря.

array

integer.decimalFormat(string)

Возвращает строковое значение из целого числа, используя формат.

string

number.decimalFormat(string)

Возвращает строковое значение из числа, используя формат.

string

integer.decimalFormat(string, string)

Возвращает строковое значение из целого числа, используя формат и локаль.

string

number.decimalFormat(string, string)

Возвращает строковое значение из числа, используя формат и локаль.

string

Полные описания полей методов и примеры использования доступны в репозитории DivKit:

Значения полей

В описании метода заполнены следующие поля:

  • function_name — название метода.

  • is_method — флаг, показывающий, является ли функция методом. Для всех методов имеет значение true.

  • doc — описание работы метода.

  • arguments — список аргументов. Каждый аргумент описывается значениями:

    • type — тип;

    • doc — описание;

    • vararang — опциональный флаг, разрешающий передавать в качестве этого аргумента не одно, а несколько значений нужного типа.

  • result_type — тип возвращамого значения.

Посмотреть интерактивный пример

Свойства

Переменная с типом property не хранит значение сама. При чтении вычисляется выражение из get, а при изменении значения выполняются действия из set.

  • value_type — тип возвращаемого значения свойства. Обязательный параметр.
  • get — значение свойства. Поддерживает выражения. Обязательный параметр.
  • set — действия, которые выполняются при установке значения свойства.
  • new_value_variable_name — имя, по которому в действиях set доступно новое значение. По умолчанию — new_value.
Пример: свойство, которое читает и изменяет значение в словаре
{
  "variables": [
    {
      "name": "source",
      "type": "dict",
      "value": {
        "color_key": "#AABBCC"
      }
    },
    {
      "name": "color_prop",
      "type": "property",
      "value_type": "color",
      "get": "@{getColorFromDict(source, 'color_key')}",
      "set": [
        {
          "log_id": "set_action_color",
          "typed": {
            "type": "dict_set_value",
            "variable_name": "source",
            "key": "color_key",
            "value": {
              "type": "string",
              "value": "@{new_value}"
            }
          }
        }
      ]
    }
  ]
}

Свойство color_prop возвращает цвет из словаря source. Действие set_variable для color_prop записывает новое значение в этот словарь.

Изменение значений переменных

Для изменения значения переменной доступно действиеset_variable. Например:

div-action://set_variable?name=common_text_size&value=17

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

Примечание

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

Примечание

В URL actions можно использовать локальные переменные уровня элемента. Например, чтобы установить глобальную переменную на основе значения локальной переменной:

div-action://set_variable?name=result&value=@{local_value}

Примеры:

  • изменить значение переменной с плавающей точкой:

    div-action://set_variable?name=price&value=3.889
    
  • изменить значение логической переменной:

    • значение true: div-action://set_variable?name=is_liked&value=1 или div-action://set_variable?name=is_liked&value=true
    • значение false: div-action://set_variable?name=is_liked&value=0 или div-action://set_variable?name=is_liked&value=false
  • изменить значение переменной типа color на зеленый цвет:

    div-action://set_variable?name=color_variable&value=@{encodeUri('#ff00ff00')}
    
  • Установка словарных переменных с выражениями:

    div-action://set_variable?name=result_dict&value=@{source_dict}
    

    Или с использованием типизированного формата:

    {
      "type": "set_variable",
      "variable_name": "result_dict",
      "value": {
        "type": "dict",
        "value": "@{source_dict}"
      }
    }
    

    Примечание

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

  • Установка словарных переменных из объектов JSON:

    Словарные переменные можно обновлять с помощью типизированных действий, передавая значение словаря напрямую:

    {
      "log_id": "set_palette",
      "typed": {
        "type": "set_variable",
        "variable_name": "palette",
        "value": {
          "type": "dict",
          "value": {
            "light": {
              "text_color": "#e0bae3"
            }
          }
        }
      }
    }
    
    Пример с URL-кодированием

    Словарные переменные также можно обновлять, предоставляя правильно URL-кодированное строковое представление JSON:

    div-action://set_variable?name=palette&value=%7B%22light%22%3A%7B%22text_color%22%3A%22%23e0bae3%22%7D%7D
    

    Это соответствует следующей структуре JSON:

    {
      "light": {
        "text_color": "#e0bae3"
      }
    }
    

Внешние переменные

Переменные, которые объявляются в верстке, являются переменными уровня карточки и недоступны извне. Для совместного использования переменных между разными верстками нужно использовать внешние переменные.

Для этого объявите DivVariableController на клиенте и передайте в него переменные, к которым нужно обращаться из верстки.

Пример для Android

Объявим DivVariableController при создании DivConfiguration:

val variableController = DivVariableController()
val configuration = DivConfiguration.Builder(imageLoader)
    .divVariableController(variableController)
    .build()

Теперь в контроллер можно передать переменную. Для примера передадим строковую переменную app_theme:

val theme = Variable.StringVariable("app_theme", "light")
variableController.putOrUpdate(theme)

Теперь во всех Div2View, созданных с помощью данной DivConfiguration, будет доступна переменная app_theme. Чтобы изменить значение переменной, в коде можно использовать метод DivVariable#set или DivVariableController#putOrUpdate. Если эта переменная уже объявленна в контроллере — ее значение также обновится.

Пример для iOS

Объявим глобальное хранилище переменных и DivVariablesStorage в DivKitComponents:

let applicationStorage = DivVariableStorage()
let variablesStorage = DivVariablesStorage(outerStorage: applicationStorage)
let divkitComponents = DivKitComponents(variablesStorage: variablesStorage)

Теперь в глобальное хранилище можно передать переменную. Для примера передадим словарь с палитрой:

let themeVariable: DivVariables = [
  DivVariableName(rawValue: "palette"): .dict([
    "text_color": "#ffffff",
    "text_background": "#0077FF"
  ])
]
applicationStorage.put(themeVariable)

Теперь во всех DivView, созданных с помощью данного DivKitComponent, будет доступна переменная palette.

DivKit использует два типа хранилищ:

  • DivVariableStorage — базовое хранилище переменных. Используйте его для глобальных переменных приложения. Имеет метод put() для добавления переменных и поддерживает создание иерархии хранилищ через outerStorage.

  • DivVariablesStorage — менеджер переменных на уровне DivKitComponents. Управляет переменными на уровне карточек через методы set(cardId:variables:) и append(variables:for:). Может иметь outerStorage типа DivVariableStorage для доступа к глобальным переменным.

Пример для Web

Создадим GlobalVariablesController:

import {createVariable, createGlobalVariablesController} from '@divkitframework/divkit';

const controller = createGlobalVariablesController();

Теперь в контроллер можно передать переменную, например словарь с палитрой:

const palette = createVariable('palette', 'dict', {
  "text_color": "#ffffff",
  "text_background": "#0077FF"
});
controller.setVariable(palette);

Теперь во всех экземплярах класса, созданных с использованием данного controller, будет доступна переменная palette.

Внимание

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

Переменные уровня элемента

Переменные уровня элемента объявляются в верстке внутри элемента, который они характеризуют.

Примечание

Переменные можно объявлять для любого элемента, а не только для объекта card.

Посмотреть интерактивный пример

Переменные для отслеживания состояния элементов

Некоторые элементы DivKit предоставляют специальные переменные для отслеживания своего состояния. Например, элемент div-pager позволяет отслеживать количество видимых элементов через переменную:

Отслеживание количества элементов в пейджере

Элемент div-pager поддерживает свойство item_count_variable, которое позволяет задать имя переменной для хранения количества видимых элементов пейджера.

Примечание

В подсчет включаются элементы со статусом видимости visible и invisible. Элементы со статусом gone не учитываются. При использовании бесконечного скролла (infinite_scroll) виртуальные страницы (дубликаты) не учитываются в реальном количестве элементов.

{
  "type": "pager",
  "item_count_variable": "pager_item_count",
  "items": [
    {
      "type": "text",
      "text": "Страница 1"
    },
    {
      "type": "text",
      "text": "Страница 2"
    }
  ]
}

Значение переменной обновляется динамически при:

  • Изменении количества элементов в пейджере
  • Изменении видимости отдельных элементов
  • Добавлении или удалении элементов

Это полезно для создания индикаторов прогресса, отображения общего количества страниц или условного показа элементов интерфейса:

{
  "log_id": "pager_item_count_example",
  "variables": [
    {
      "name": "pager_item_count",
      "type": "integer",
      "value": 0
    }
  ],
  "states": [
    {
      "state_id": 0,
      "div": {
        "type": "container",
        "items": [
          {
            "type": "text",
            "text": "Всего страниц: @{pager_item_count}"
          },
          {
            "type": "pager",
            "item_count_variable": "pager_item_count",
            "items": [
              {
                "type": "text",
                "text": "Страница 1"
              },
              {
                "type": "text",
                "text": "Страница 2"
              },
              {
                "type": "text",
                "text": "Страница 3"
              }
            ]
          }
        ]
      }
    }
  ]
}
Посмотреть интерактивный пример

Хранимые значения

Значения, которые сохраняются на устройстве и доступны после перезапуска приложения, описаны на странице Хранимые значения.

Триггеры

Выполнение действий при изменении значений переменных описано на странице Триггеры.

Узнать больше

Вы можете обсуждать интересующие вас темы в сообществе пользователей DivKit в Telegram: https://t.me/divkit_community_ru.

Репозиторий DivKit

Предыдущая
Следующая