请问一下,初始化创建屏幕后,返回按键也增加了删除创建scr2屏幕代码,再次点击按钮进入scr2屏幕为什么还是内存跟着增加呀,点一次内存就增加一次

#if 1
// 声明为全局变量
static lv_obj_t * scr1;
static lv_obj_t * scr2;

LV_FONT_DECLARE(FontAwesome_40); // 外部声明生成的特殊字体
LV_FONT_DECLARE(myfont);         // 基本常用汉字,大小36号
LV_FONT_DECLARE(SourceHanSansCN_Medium_36);

// 创建主屏幕
void createhome(void) {
    scr1 = lv_obj_create(NULL);
    if (scr1 == NULL)
    LV_LOG_USER("错误,无法创建scr1\n");
    else
    LV_LOG_USER("创建scr1成功\n");
}

// 创建大棚按钮屏幕
void createdapengbtn(void) {
    scr2 = lv_obj_create(NULL);
    if (scr2 == NULL)
    LV_LOG_USER("错误,无法创建scr2\n");
    else
    LV_LOG_USER("创建scr2成功\n");
}

// 删除屏幕 scr1
void delete_scr1(void) {
    if (scr1 != NULL) {
        lv_obj_del(scr1);
        scr1 = NULL;
        LV_LOG_USER("scr1 已删除\n");
    }
}

// 删除屏幕 scr2
void delete_scr2(void) {
    if (scr2 != NULL) {
        lv_obj_del(scr2);
        scr2 = NULL;
        LV_LOG_USER("scr2 已删除\n");
    }
}

// 按钮事件处理程序 3
static void btn_event_handler3(lv_event_t * e) {
    // 获取触发事件的目标对象
    lv_obj_t * btn = lv_event_get_target(e);
    // 获取触发事件的代码
    lv_event_code_t code = lv_event_get_code(e);
    
    if (code == LV_EVENT_CLICKED) {
        delete_scr2();
        createhome();
        create_scr1();//确保调用create_scr1
        LV_LOG_USER("点击按钮 3,切换到 scr1\n");
    }
}

// 创建屏幕 2 的函数
void create_scr2(void) {
    if (scr2 == NULL)
    createdapengbtn();
 
    lv_scr_load(scr2);
    LV_LOG_USER("scr2 加载\n");

    // 设置返回按钮
    lv_obj_t * btn2 = lv_btn_create(scr2);
    lv_obj_t * label2 = lv_label_create(btn2);
    lv_obj_set_size(btn2, 150, 100); // 设置按钮大小
    lv_obj_align(btn2, LV_ALIGN_BOTTOM_LEFT, 350, 30);
    lv_obj_set_style_text_font(label2, &FontAwesome_40, 0);
    lv_label_set_text(label2, "\xEF\x80\x95");
    lv_obj_set_style_text_color(label2, lv_color_hex(0xffffff), 0);
    lv_obj_align(label2, LV_ALIGN_CENTER, 0, 0);
    lv_obj_add_event_cb(btn2, btn_event_handler3, LV_EVENT_CLICKED, NULL); // 添加事件
}

// 按钮事件处理程序
static void btn_event_handler(lv_event_t * e) {
    // 获取触发事件的目标对象
    lv_obj_t * btn = lv_event_get_target(e);
    // 获取触发事件的代码
    lv_event_code_t code = lv_event_get_code(e);

    if (code == LV_EVENT_CLICKED) {
      LV_LOG_USER("按钮点击切换到 scr2\n");
      create_scr2();
    }
}

// 创建屏幕 1 的函数
void create_scr1(void) {
    if (scr1 == NULL)
    createhome();
 
    lv_scr_load(scr1);
    LV_LOG_USER("scr1 加载\n");

    lv_obj_t * btn = lv_btn_create(scr1);
    lv_obj_set_size(btn, 150, 150); // 设置按钮大小
    lv_obj_align(btn, LV_ALIGN_TOP_LEFT, 30, 80); // 设置按钮位置
    lv_obj_set_style_bg_color(btn, lv_color_hex(0x4684FD), LV_PART_MAIN);
    
    // 创建按钮文本
    lv_obj_t * label3 = lv_label_create(btn);
    lv_obj_set_style_text_font(label3, &SourceHanSansCN_Medium_36, 0);
    lv_obj_set_style_text_opa(label3, LV_OPA_100, 0);
    lv_label_set_text(label3, "大棚");
    lv_obj_align(label3, LV_ALIGN_BOTTOM_MID, 0, 0);
    lv_obj_set_style_text_color(label3, lv_color_hex(0xffffff), 0);

    // 创建特殊字体图标
    lv_obj_t * label4 = lv_label_create(btn);
    lv_obj_set_style_text_font(label4, &FontAwesome_40, 0);
    lv_label_set_text(label4, "\xEF\x92\x94");
    lv_obj_set_style_text_color(label4, lv_color_hex(0xffffff), 0);
    lv_obj_align(label4, LV_ALIGN_CENTER, 0, -20);
    
    // 添加点击后创建新屏幕事件
    lv_obj_add_event_cb(btn, btn_event_handler, LV_EVENT_CLICKED, NULL);
}
#endif

仔细对比检查这两个的处理:

周老师,你的意思是主按钮绑定的事件进入src2屏幕也应该加上删除scr1的代码吗,请问一下如果我这个屏幕中有其他按钮,并且按钮事件绑定控制下位机实体按键的功能,我进去其他屏幕,删除这个屏幕会不会删除这些按钮,如果删除这些按钮后,那绑定的功能我单片机上还会像没有删除之前那样执行吗,还是说删除那个屏幕后,单片机的按键也无法工作了?

你这个问题是有一个页面的退出并没有做好资源回收,并且又重复创建了新的控件,不管你有多少按钮或者其他控件都应该做好处理、不要一直重复创建。

如果你硬件的资源足够,你可以只创建一次,后续只需要将他们隐藏起来即可。