← 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時調用

在小工具集或重複使用結構中,物件建立和螢幕顯示不應被視為相同事件。 區分每個按鈕連接、資料初始化和螢幕更新應該在什麼時候執行非常重要。