Only Lable widget can be show?

i’m newbie on LVGL.

i port lvgl to a STM32F405 proj, use SH1107 oled (128x64) via i2c

it show text after i call:

lv_obj_t *label = lv_label_create(lv_scr_act());
lv_label_set_text(label, “hEllo”);
lv_obj_center(label);

lv_obj_t *bar = lv_bar_create(lv_scr_act());
lv_bar_set_range(bar, 0, 100);
lv_bar_set_value(bar, 50, LV_ANIM_OFF);

others widget(button/ bar/ silider/ Line…) can be created, but never displayed on screen?

Did you know why?

====

Thanks to a blog by costascal

here is my low level driver code

void ssd1306_set_px_cb(lv_disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w,
lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa) {
// printf(“pcb\n”);

uint16_t byte_index = x + ((y >> 3) * buf_w);
uint8_t bit_index = y & 0x7;

if (color.full == 0) {
    BIT_SET(buf[byte_index], bit_index);
} else {
    BIT_CLEAR(buf[byte_index], bit_index);
}

}

void ssd1306_flush_cb(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) {
uint8_t row1 = area->y1 >> 3;
uint8_t row2 = area->y2 >> 3;
uint8_t *buf = (uint8_t *)color_p;

uint8_t _col;
uint16_t _len;

for (uint8_t row = row1; row <= row2; row++) {
    ssd1306_cmd(0xB0 | row);
    _col = area->x1 + 2; // +2 for SH1106
    ssd1306_cmd(0x00 | (_col & 0xf));
    ssd1306_cmd(0x10 | (_col >> 4) & 0xf);

    _len = area->x2 - area->x1 + 1;
    HAL_I2C_Mem_Write(&(SSD1306_I2C_DEV), SSD1306_I2C_ADDR, 0x40, 1, buf, _len, 100);
    buf += _len;
}

lv_disp_flush_ready(disp_drv);

}

void ssd1306_rounder_cb(lv_disp_drv_t *disp_drv, lv_area_t *area) {
// printf(“rcb\n”);

area->y1 = (area->y1 & (~0x7));
area->y2 = (area->y2 & (~0x7)) + 7;

}

need help…