UE5.7 How to create UTexture2DArray in cpp?

I attempted to create a new texture array in C++ and add textures to it, but after saving, the texture array asset appears black. It only displays correctly after manually modifying parameters in the editor to trigger a recompile.

this is create result

after i change sourcetexture

UTexture2DArray* NewTexture = CreateTransientArrayWithMips(TextureSize, Texture2DArray.Num(), PixelFormat, SRGB, RF_Public | RF_Standalone, *Name, Package);
		NewTexture->MipGenSettings = TMGS_FromTextureGroup;
		if (PixelFormat == PF_BC7)
		{
			NewTexture->CompressionSettings = TC_BC7;
		}
		else if (PixelFormat == PF_R16F)
		{
			NewTexture->CompressionSettings = TC_HalfFloat;
		}
		for (auto Texture : Texture2DArray)
		{
			NewTexture->SourceTextures.Add(Texture);
		}
		NewTexture->MaxTextureSize = TextureSize;
	NewTexture->UpdateSourceFromSourceTextures(false);
		NewTexture->UpdateResource();
		FAssetRegistryModule::AssetCreated(NewTexture);

		FString PackageFileName = FPackageName::LongPackageNameToFilename(FullPackagePath, FPackageName::GetAssetPackageExtension());

		FSavePackageArgs SaveArgs;
		SaveArgs.TopLevelFlags = RF_Public | RF_Standalone;
		SaveArgs.Error = GLog;
		SaveArgs.bForceByteSwapping = false;
		SaveArgs.SaveFlags = SAVE_NoError;
		GEditor->SavePackage(Package, NewTexture, *PackageFileName, SaveArgs);
UTexture2DArray* CreateTransientArrayWithMips(int32 InSize, int32 InCapacity, EPixelFormat Format, bool bSRGB, EObjectFlags Flags, FName name = NAME_None,
                                              UPackage* Package = GetTransientPackage())
{
	UTexture2DArray* NewTexture = nullptr;
	if (InSize > 0 && InSize > 0 && InCapacity > 0 &&
		(InSize % GPixelFormats[Format].BlockSizeX) == 0 &&
		(InSize % GPixelFormats[Format].BlockSizeY) == 0)
	{
		NewTexture = NewObject<UTexture2DArray>(
			Package,
			name,
			Flags
		);

		NewTexture->SetPlatformData(new FTexturePlatformData());
		NewTexture->GetPlatformData()->SizeX = InSize;
		NewTexture->GetPlatformData()->SizeY = InSize;
		NewTexture->GetPlatformData()->SetNumSlices(InCapacity);
		NewTexture->GetPlatformData()->PixelFormat = Format;
		NewTexture->bNotOfflineProcessed = true;

		// Allocate first mipmap.
		int32 NumBlocksX = InSize / GPixelFormats[Format].BlockSizeX;
		int32 NumBlocksY = InSize / GPixelFormats[Format].BlockSizeY;
		FTexture2DMipMap* Mip = new FTexture2DMipMap(InSize, InSize, InCapacity);
		NewTexture->GetPlatformData()->Mips.Add(Mip);
		Mip->BulkData.Lock(LOCK_READ_WRITE);
		Mip->BulkData.Realloc((int64)GPixelFormats[Format].BlockBytes * NumBlocksX * NumBlocksY * InCapacity);
		Mip->BulkData.Unlock();
	}
	else
	{
		UE_LOG(LogTexture, Warning, TEXT("Invalid parameters specified for UTexture2DArray::CreateTransient()"));
	}


	if (!NewTexture) return nullptr;

	FTexturePlatformData* PD = NewTexture->GetPlatformData();
	int32 MipSizeX = InSize >> 1;
	int32 MipSizeY = InSize >> 1;

	while (MipSizeX > 0 && MipSizeY > 0)
	{
		int32 NumBlocksX = FMath::Max(1, MipSizeX / (int32)GPixelFormats[Format].BlockSizeX);
		int32 NumBlocksY = FMath::Max(1, MipSizeY / (int32)GPixelFormats[Format].BlockSizeY);
		FTexture2DMipMap* Mip = new FTexture2DMipMap(MipSizeX, MipSizeY, InCapacity);
		PD->Mips.Add(Mip);
		Mip->BulkData.Lock(LOCK_READ_WRITE);
		int64 TotalByteSize = (int64)GPixelFormats[Format].BlockBytes * NumBlocksX * NumBlocksY * InCapacity;
		FMemory::Memzero(Mip->BulkData.Realloc(TotalByteSize), TotalByteSize);
		Mip->BulkData.Unlock();

		if (MipSizeX == 1 && MipSizeY == 1) break;
		MipSizeX = FMath::Max(1, MipSizeX >> 1);
		MipSizeY = FMath::Max(1, MipSizeY >> 1);
	}
	NewTexture->SRGB = bSRGB;
	NewTexture->NeverStream = false;
	NewTexture->UpdateResource();

	return NewTexture;
}