Lv_style_set_bg_opa causes kernel panic (LoadProhibited)

I’m building a config-driven dashboard on top of ESPHome using LVGL8.3. All testing is done on WT32S3-86S (ESP32-S3, 4", 480x480 screen, 8Mb PSRAM). The initial version works fine but uses local styles, so one of the main changes I’m adding is reusable styles.

To store new styles for a component, a C++ class is used.

class HaDeckWidgetStyle
{
public:
    HaDeckWidgetStyle();
    StyleGroup *get_main();

    void set_bg_color(uint32_t value, lv_state_t selector);
    void set_bg_opacity(uint8_t value, lv_state_t selector);
protected:
    void set_bg_color_(StyleGroup *style, uint32_t value, lv_state_t selector);
    void set_bg_opacity_(StyleGroup *style, uint8_t value, lv_state_t selector);

    lv_style_t main_def_;
    lv_style_t main_disabled_;
    lv_style_t main_checked_;
    StyleGroup main_ = {nullptr, nullptr, nullptr};
};

// Part of implementation
HaDeckWidgetStyle::HaDeckWidgetStyle() {
    lv_style_init(&main_def_);
    lv_style_init(&main_disabled_);
    lv_style_init(&main_checked_);
    main_.def = &main_def_;
    main_.disabled = &main_disabled_;
    main_.checked = &main_checked_;
}
void HaDeckWidgetStyle::set_bg_color(uint32_t value, lv_state_t selector) {
    set_bg_color_(&main_, value, selector);
}
void HaDeckWidgetStyle::set_bg_opacity(uint8_t value, lv_state_t selector) {
    set_bg_opacity_(&main_, value, selector);
}
void HaDeckWidgetStyle::set_bg_color_(StyleGroup *style, uint32_t value, lv_state_t selector) {
    if (selector == LV_STATE_DEFAULT) {
        lv_style_set_bg_color(style->def, lv_color_hex(value));
    }
    if (selector & LV_STATE_DISABLED) {
        lv_style_set_bg_color(style->disabled, lv_color_hex(value));
    }
    if (selector & LV_STATE_CHECKED) {
        lv_style_set_bg_color(style->checked, lv_color_hex(value));
    }
}
void HaDeckWidgetStyle::set_bg_opacity_(StyleGroup *style, uint8_t value, lv_state_t selector) {
    if (selector == LV_STATE_DEFAULT) {
        lv_style_set_bg_opa(style->def, value);
    }
    if (selector & LV_STATE_DISABLED) {
        lv_style_set_bg_opa(style->disabled, value);
    }
    if (selector & LV_STATE_CHECKED) {
        lv_style_set_bg_opa(style->checked, value);
    }
}

Everything works fine if lv_style_set_bg_opa is not used, but if I try to set the bg opacity - it crushes:

search_suitable_block at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_tlsf.c:564
(inlined by) block_locate_free at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_tlsf.c:770
lv_tlsf_malloc at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_tlsf.c:1102
lv_mem_alloc at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_mem.c:134
(inlined by) lv_mem_alloc at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_mem.c:125
lv_style_set_prop_internal at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_style.c:464
lv_style_set_prop at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_style.c:284
lv_style_set_bg_opa at /config/.esphome/build/room-screen-1/.piolibdeps/room-screen-1/lvgl/src/misc/lv_style_gen.c:200
esphome::ha_deck::HaDeckWidgetStyle::set_bg_opacity_(esphome::ha_deck::StyleGroup*, unsigned char, unsigned short) at /config/.esphome/build/room-screen-1/src/esphome/components/ha_deck/ha_deck_widget.cpp:142
esphome::ha_deck::HaDeckWidgetStyle::set_bg_opacity(unsigned char, unsigned short) at /config/.esphome/build/room-screen-1/src/esphome/components/ha_deck/ha_deck_widget.cpp:103
setup() at /config/room-screen-1.yaml:89
loopTask(void*) at /config/.esphome/platformio/packages/framework-arduinoespressif32/cores/esp32/main.cpp:42

Any suggestion on what I’m doing wrong?

Found out that lv_style_set_bg_opa was called before lv_init;