Perluas .NET Hot Reload menggunakan MetadataUpdateHandler (C#, Visual Basic)
Anda dapat secara terprogram memperluas dukungan .NET Hot Reload untuk skenario tambahan yang biasanya tidak didukung, seperti perubahan kode yang memerlukan penghapusan cache atau refresh UI. Misalnya, untuk mendukung hot reload dengan serializer JSON, Anda perlu menghapus cache saat jenis dimodifikasi. Untuk pengembang MAUI .NET, Anda mungkin perlu memperluas pemuatan ulang panas untuk pengeditan/pembaruan yang tidak memicu pemuatan ulang panas dalam kondisi normal, seperti mengedit konstruktor, atau penanganan aktivitas untuk elemen UI. Anda dapat menggunakan MetadataUpdateHandlerAttribute untuk merefresh status aplikasi, memicu render ulang UI, atau melakukan tindakan serupa.
Jenis yang ditentukan oleh atribut ini harus menerapkan metode statis yang cocok dengan tanda tangan satu atau beberapa hal berikut:
static void ClearCache(Type[]? updatedTypes)
static void UpdateApplication(Type[]? updatedTypes)
ClearCache
memberi penanganan pembaruan kesempatan untuk menghapus cache apa pun yang disimpulkan berdasarkan metadata aplikasi. Setelah semua ClearCache
metode dipanggil, UpdateApplication
dipanggil untuk setiap handler yang menentukannya. Anda mungkin menggunakan UpdateApplication
untuk menyegarkan UI.
Contoh
Contoh berikut menunjukkan skenario untuk proyek .NET MAUI yang awalnya tidak mendukung hot reload, tetapi kemudian mendukung fitur setelah menerapkan MetadataUpdateHandler
.
Uji .NET Hot Reload
Buat proyek .NET MAUI baru di Visual Studio. Pilih templat proyek Aplikasi .NET MAUI.
Di App.xaml.cs, ganti kode untuk membuat MainPage dengan kode berikut:
//MainPage = new MainPage(); // Template default code MainPage = new NavigationPage(new MainPage());
Selanjutnya, Anda menerapkan metode Build untuk menyederhanakan pembaruan UI di C#. Metode ini mengatur
ContentPage.Content
dan dipanggil di halamanOnNavigatedTo
. PeristiwaOnNavigatedTo
harus dihosting dalam Shell atau NavigationPage.Di MainPage.xaml.cs, ganti
MainPage
kode konstruktor dengan kode berikut:public MainPage() { InitializeComponent(); Build(); } void Build() => Content = new Label { Text = "First line\nSecond line" }; protected override void OnNavigatedTo(NavigatedToEventArgs args) { base.OnNavigatedTo(args); Build(); }
Tekan F5 untuk memulai aplikasi.
Setelah halaman dimuat, ubah teks label dalam kode C# menjadi sesuatu seperti: "Baris pertama\nBaris sejajar\nBaris awal"
Pilih tombol Muat Ulang Panas.
Teks yang diperbarui tidak ditampilkan di aplikasi yang sedang berjalan. Tidak ada dukungan Hot Reload untuk skenario ini secara default.
Menambahkan MetadataUpdateHandler
Dalam aplikasi .NET MAUI, Anda harus melakukan sesuatu untuk menjalankan kembali kode antarmuka pengguna C# setelah Anda membuat perubahan kode. Jika kode UI Anda ditulis dalam C#, Anda dapat menggunakan UpdateApplication
metode untuk MetadataUpdateHandler
memuat ulang UI. Untuk menyiapkannya, tambahkan HotReloadService.cs ke aplikasi Anda menggunakan kode berikut.
#if DEBUG
[assembly: System.Reflection.Metadata.MetadataUpdateHandlerAttribute(typeof(YourAppNamespace.HotReloadService))]
namespace YourAppNamespace {
public static class HotReloadService
{
#pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
public static event Action<Type[]?>? UpdateApplicationEvent;
#pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
internal static void ClearCache(Type[]? types) { }
internal static void UpdateApplication(Type[]? types) {
UpdateApplicationEvent?.Invoke(types);
}
}
}
#endif
Pastikan Anda mengganti YourAppNamespace
dengan namespace layanan untuk halaman yang Anda targetkan.
Sekarang, dengan kode sebelumnya ditambahkan, saat Anda mengedit kode langsung di Visual Studio, perubahan metadata terjadi dan aplikasi mengirimkan UpdateApplicationEvent
. Jadi, Anda perlu menambahkan kode untuk mendaftarkan peristiwa dan melakukan pembaruan UI.
Catatan
Untuk skenario ini, XAML Hot Reload harus diaktifkan.
Di MainPage.xaml.cs, tambahkan kode untuk mendaftarkan UpdateApplicationEvent
penanganan aktivitas dalam OnNavigatedTo
peristiwa.
protected override void OnNavigatedTo(NavigatedToEventArgs args)
{
base.OnNavigatedTo(args);
Build();
#if DEBUG
HotReloadService.UpdateApplicationEvent += ReloadUI;
#endif
}
Berhenti berlangganan penanganan aktivitas masuk OnNavigatedFrom
lalu tambahkan kode untuk menangani peristiwa dan jalankan kembali panggilan ke Build
.
protected override void OnNavigatedFrom(NavigatedFromEventArgs args)
{
base.OnNavigatedFrom(args);
#if DEBUG
HotReloadService.UpdateApplicationEvent -= ReloadUI;
#endif
}
private void ReloadUI(Type[] obj)
{
MainThread.BeginInvokeOnMainThread(() =>
{
Build();
});
}
Sekarang, mulai aplikasi. Saat Anda membuat perubahan pada teks label dalam kode C# Anda dan menekan tombol Muat Ulang Panas, UI akan di-refresh!
Konten terkait
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk