在 LVGL 开发中,最常见的新手问题:界面创建成功、指针不为空,但切换页面直接黑屏。
问题根源只有一句话:对象在内存中存在 ≠ 对象正在屏幕上显示。
一、极简通俗模型(必记)
把所有 LVGL 屏幕理解为幻灯片:
界面指针= 手里拿着的幻灯片(内存存在)
lv_screen_load()= 放到投影仪上播放(屏幕显示)
lv_obj_delete()= 直接扔掉幻灯片(销毁内存)
关键点:手里有幻灯片,不会自动播放;投影仪切走后,幻灯片还在手里,不会自动消失。
二、对错代码对照(黑屏 Bug 一眼看穿)
错误代码(会黑屏)
static void to_login_screen_cb(lv_event_t *e) { if(login_screen == NULL) { test(); // 只创建对象(拿在手里) } // 严重缺失:没有 lv_screen_load() 上墙播放 if(scr != NULL) { lv_obj_delete(scr); // 删掉旧屏幕 scr = NULL; } }问题:删掉了旧界面,却没有加载新界面 → 屏幕无内容,直接黑屏。
正确代码(标准跳转)
static void to_login_screen_cb(lv_event_t *e) { // 1. 不存在则创建(懒加载) if(login_screen == NULL) { test(); } // 2. 核心:加载到屏幕显示 lv_screen_load(login_screen); // 3. 安全释放旧界面内存 if(scr != NULL) { lv_obj_delete(scr); scr = NULL; } }三、核心原理(极简总结)
创建界面:仅开辟内存,界面驻留后台,不显示。
切换界面:必须调用
lv_screen_load(),这是唯一刷新屏幕的方式。删除时机:先加载新界面,再删除旧界面。顺序颠倒必黑屏。
四、固定标准流程(直接套用)
所有 LVGL 页面跳转统一遵循三步:
判断目标界面是否存在,不存在则初始化
强制 lv_screen_load() 刷新显示
释放上一级界面内存,防止泄漏
五、最终结论
LVGL 黑屏、界面切不出来,99% 不是硬件问题,是少写了 lv_screen_load。
永远记住:内存有对象 ≠ 屏幕有画面。