← SEARCHABLE ARCHIVE
Unreal Engine · 2026-07-04

Widget生命周期和委托重叠连接

再次调用NativeConstruct时出现的问题

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

UUserWidget::NativeConstruct()人们很容易认为仅在第一次创建对象时调用一次。 但是,如果将小部件从屏幕上删除并再次添加,则可能会再次调用 Construct。

代表可以冗余连接

void UDailyProblemWidget::NativeConstruct()
{
    Super::NativeConstruct();

    SubmitButton->OnClicked.AddDynamic(
        this,
        &UDailyProblemWidget::HandleSubmit
    );
}

如果 Construct 被调用两次,则该函数可能会在同一个按钮单击时执行两次。 在存储、扣货、创建节点等逻辑上,对实际数据进行了冗余处理。

在 ProjectDT 中,它被组织为在连接之前删除相同的代理。

if (SubmitButton)
{
    SubmitButton->OnClicked.RemoveDynamic(
        this,
        &UDailyProblemWidget::HandleSubmit
    );

    SubmitButton->OnClicked.AddDynamic(
        this,
        &UDailyProblemWidget::HandleSubmit
    );
}

NativeOnInitialized 和 NativeConstruct

只需要准备一次的任务NativeOnInitialized()可能更合适。 每次屏幕返回时需要更新的值为NativeConstruct()我在单独的安装函数中处理它。

NativeOnInitialized:在对象的生命周期内一次
NativeConstruct:附加到视图时可以再次调用
NativeDestruct:离开View时调用

在小部件池或重用结构中,对象创建和屏幕显示不应被视为同一事件。 区分每个按钮连接、数据初始化和屏幕更新应该在什么时候执行非常重要。