Pengumuman pengujian beta Dart null-safety. Memulai proses migrasi paket ke keadaan aman dan terlindungi





Tentu saja, null-safety merupakan langkah penting dalam perkembangan bahasa. Tim Dart telah mengumumkan rilis beta dari versi keamanan nol! Kami telah menerjemahkan ke dalam bahasa Rusia berita tentang rilis ini, di mana Anda akan belajar cara bermigrasi ke versi baru, manfaat apa yang akan Anda dapatkan, dan apa manfaat keamanan nol bagi kita semua.



Hari ini kami mengumumkan bahwa nol-keamanan beta yang andal tersedia untuk Dart dan Flutter. Null-safety adalah kemajuan besar terbaru kami untuk membantu Anda menghindari bug referensi null, kelas bug yang seringkali sulit dideteksi. Video ini menjelaskan secara umum alasan kegembiraan kita:





Dengan beralih ke beta keamanan nol, saatnya untuk memigrasi ribuan paket yang tersedia di pub.dev . Kami telah memindahkan pustaka inti Dart, kerangka kerja Flutter, dan lebih dari 40 paket Dart dan Flutter. Karena itu, kami berharap masyarakat menerima null-safety dengan memigrasikan paket mereka.







Dengan rilis beta, kami juga memasuki tahap awal sebelum rilis stabil null-safety dirilis. Kami berharap Anda memanfaatkan fungsi ini dan memberi tahu kami jika kami dapat meningkatkannya dan membuat pesan UI dan dokumentasi lebih jelas. Kami menantikan tanggapan Anda .



Memilih null-safety



Sebelum membahas migrasi ke null-safety, kami ingin menegaskan kembali bahwa (seperti yang dinyatakan dalam pedoman keamanan null kami ) Anda memiliki kemampuan untuk memilih dengan tepat kapan harus memulai migrasi. Aplikasi dan paket hanya akan berfungsi dengan null-safety jika batas minimum Dart SDK mereka setidaknya versi pra-rilis Dart 2.12:



environment:
 sdk: ">=2.12.0-0 <3.0.0"


Untuk mencobanya, coba buat aplikasi hello keamanan null kecil (misalnya dengan dart create) yang berisi kode seperti yang ditunjukkan di bawah ini. Anda kemudian dapat mencoba menjalankan aplikasi sebelum dan setelah mengubah batas SDK dan meluncurkan dart pub getdan melihat bagaimana perilaku program berubah. (Pastikan untuk dart --versionmengembalikan tepat 2.12 kepada Anda).



bin/hello.dart:
...
void main() {
  var hello = 'Hello Dart developers';
  if (someCondition) {
	hello = null;
  }
  print(hello);
}
 
Before changing the SDK constraint:
$ dart run
 
null
 
After changing the SDK constraint (and running dart pub get):

$ dart run
 
bin/hello.dart:6:13: Error: Null can't be assigned to a variable of 
type 'String' because 'String' is not nullable.
 
	hello = null;
        	^


Pindah ke keamanan nol



Untuk memigrasi paket (atau aplikasi sederhana) ke mode perlindungan-null, ikuti lima langkah berikut, yang dirinci dalam panduan migrasi dart.dev.



Langkah 1: Periksa apakah dependensi Anda sudah siap



Kami sangat menyarankan Anda untuk memindahkan kode secara berurutan, dimulai dengan "daun" dari grafik ketergantungan. Misalnya, jika C bergantung pada B, yang bergantung pada A, bermigrasi ke keamanan-null A terlebih dahulu, lalu B, lalu C. Urutan ini berlaku apakah A, B, dan C adalah pustaka, paket, atau aplikasi.







Mengapa keteraturan begitu penting? Anda dapat membuat beberapa kemajuan dalam memigrasi kode Anda sebelum memigrasi dependensi, tetapi Anda berisiko harus menjalankan ulang jika dependensi Anda mengubah antarmuka mereka selama migrasi. Jika beberapa dependensi Anda bukan null-safety, pertimbangkan untuk menghubungi penerbit paket menggunakan detail kontak yang tercantum untuk setiap paket di pub.dev.



Memeriksa apakah dependensi sudah siap



Untuk memeriksa apakah aplikasi atau paket Anda siap untuk mulai bermigrasi, Anda dapat menjalankan dart pub outdateddalam mode perlindungan null. Contoh di bawah ini menunjukkan bahwa aplikasi akan siap untuk migrasi jika memperbarui dependensinya ke path, processdan pedanticke, versi pra-rilis yang tercantum di kolom Dapat Diatasi .







Jika dukungan null-safety tersedia dalam versi minor yang lebih baru, Anda akan melihatnya di kolom Upgradable . Dukungan keamanan penuh akan sering tersedia dalam rilis baru utama; dalam hal ini, Anda akan melihat versi yang tercantum di bagian yang dapat diselesaikan di keluaran dari utilitas yang sudah ketinggalan zaman. Untuk beralih ke mereka, edit file pubspec.yamluntuk mengizinkan versi utama ini. Misalnya, Anda dapat mengubah

process: ^3.0.13ke process: ^4.0.0-nullsafety.



Anda juga dapat menemukan paket dengan dukungan keamanan null di pub.dev menggunakan tag keamanan Null baru di halaman paket (mis. Collection 1.15 ) dan opsi Pencarian keamanan null lanjutan baru .







Langkah 2: Transfer menggunakan alat migrasi



Setelah dependensi siap, Anda dapat mulai memigrasi aplikasi atau paket Anda menggunakan alat migrasi dart migrate.



Alat migrasi bersifat interaktif, sehingga Anda dapat melihat properti null-safety yang disimpulkan oleh alat ini. Jika Anda tidak setuju dengan hasil apa pun dari alat tersebut, Anda dapat menambahkan petunjuk nol untuk mengubahnya. Menambahkan beberapa petunjuk saja dapat berdampak besar pada kualitas migrasi Anda.







Beberapa pembuat paket Dart telah menguji migrasi menggunakan build null-safety pre-build awal, dan umpan balik mereka sangat menggembirakan. Panduan migrasi memiliki tip tambahan untuk menggunakan alat migrasi.



Langkah 3: Analisis statis kode porting



Perbarui paket menggunakan pub get di IDE atau baris perintah Anda. Kemudian gunakan IDE atau baris perintah untuk melakukan analisis statis pada kode Dart Anda:



$ dart pub get
$ dart analyze




Atau dalam kode Flutter:



$ flutter pub get
$ flutter analyze


Langkah 4: Pastikan tes lulus



Jalankan pengujian dan pastikan lulus dengan aman. Anda mungkin perlu memperbarui tes yang mengharapkan null jika Anda mengubah kode paket Anda untuk tidak mengizinkan nilai null.



Langkah 5: Publikasikan paket keamanan null Anda



Setelah menyelesaikan migrasi dan menjalankan pengujian, Anda dapat mempublikasikan paket Anda sebagai Prarilis. Berikut ringkasan praktik terbaik:



  • Tingkatkan versi ke versi utama berikutnya (misalnya, dari 2.3.xke 3.0.0). Ini memastikan bahwa pengguna paket Anda tidak memutakhirkannya sampai mereka siap menggunakan null-safety. Ini memberi Anda kebebasan untuk memfaktor ulang API Anda untuk memanfaatkan keamanan null dengan sebaik-baiknya.
  • Terjemahkan dan publikasikan paket Anda sebagai pratinjau di pub.dev . (Misalnya, gunakan 3.0.0-nullsafety.0daripada 3.0.0.)


Untuk informasi lebih lanjut tentang migrasi dan pembuatan versi, lihat panduan migrasi .



Manfaat jaminan keamanan nol



Posting kami sebelumnya tentang pratinjau teknis keselamatan nol di Dart dan Flutter membahas manfaat perubahan ini menggunakan sejumlah contoh. Sekarang keamanan nol hampir selesai, kami melihat beberapa contoh dunia nyata dari manfaat ini.



Kode yang lebih aman



Kami baru-baru menemukan sebuah bug pada cabang Flutter utama yang menyebabkan berbagai perintah alat untuk fluttercrash pada konfigurasi mesin tertentu dengan null: kesalahan The method '>=' was called on null. Masalah utamanya adalah permintaan penarikan baru-baru ini untuk menambahkan dukungan untuk deteksi Android Studio 4.1. Permintaan tarik ini menambahkan kode seperti ini:



final int major = version?.major;
final int minor = version?.minor;
if (globals.platform.isMacOS) {
  /// plugin path of Android Studio changed after version 4.1.
  if (major >= 4 && minor >= 1) {
    ...


Bisakah Anda menemukan bug? Karena versinya bisa nihil, versi mayor dan minor bisa nihil juga. Bug ini mungkin tampak mudah ditemukan di sini secara terpisah, tetapi dalam praktiknya, kode semacam ini selalu lolos sepanjang waktu, bahkan dengan proses peninjauan kode yang ketat yang digunakan di repositori Flutter. Dengan null-safety, analisis statis menangkap masalah ini dengan segera :







Itu adalah kesalahan yang cukup sederhana. Pada hari-hari awal penggunaan null-safety dalam kode internal Google, kami melihat berapa banyak error yang lebih kompleks yang terdeteksi dan kemudian diselesaikan dengan null-safety. Berikut beberapa contohnya:



  • , null , null-safety null. , protobuf, , , null. , , - null .
  • Google Pay Flutter, - Flutter State Widget. null-safety null ; null-safety , null, .
  • Flutter , - Flutter , null scene Window.render(). null-safety , Scene , , null.


null-safety



Keamanan nol Dart juga penting: Penyusun Dart dapat memanfaatkan informasi keamanan nol. Ini dapat membuat program Anda lebih kecil dan lebih cepat. Sejauh ini, kami tidak memiliki banyak aplikasi nyata yang sepenuhnya diterjemahkan ke null-safety (lagipula, kami baru saja mulai memigrasi ekosistem paket tempat aplikasi ini bergantung untuk keandalan), tetapi kami melihat hasil yang sangat menggembirakan dari framework utama.



Kami baru-baru ini menjalankan uji kompilasi ulang sampel hello_world untuk mengukur dampak keamanan-null pada ukuran aplikasi. Ini adalah contoh minimal yang hanya menampilkan "hello world". Saat membandingkanukuran total kode yang dikompilasi, ukuran kode yang tidak dikompresi (dipasang pada perangkat) dikurangi sebesar 3,5% tanpa tindakan apa pun selain kompilasi ulang dengan keamanan nol yang andal. Hal ini dimungkinkan terlepas dari kenyataan bahwa seluruh aplikasi terdiri dari 10 baris kode, karena ukuran kode dari semua pustaka yang disertakan dikurangi; misalnya, kerangka Flutter ( package:flutter) itu sendiri telah menyusut 3,9%.



Dalam hal kecepatan kode, kebutuhan untuk menerapkan sistem tipe data tepercaya berpotensi meningkatkan overhead. Namun, pemeriksaan null yang lebih sedikit juga berpotensi mempercepat kode Anda. Analisis awal dari tolok ukur menunjukkan bahwa kinerja setara dengan rilis sebelumnya, dan informasi jenis tambahan baru memberi kami potensi cara baru untuk meningkatkan kinerja di masa mendatang. Kami berencana untuk menulis lebih banyak tentang ini di publikasi mendatang.



Dalam beberapa kasus, kami telah melihat bagaimana null-safety menyebabkan peningkatan kinerja ketika transisi mengungkapkan cacat dalam logika kode. Misalnya, kami menemukan masalah di cache pemosisian teks web Flutter. Cache ini menggunakan kunci nullable dan kemudian, sesuai dengan logika yang diberikan, digunakanTextAlign.startketika nol. Logika ini memunculkan kesalahan cache di mana item tampak seperti telah berubah, meskipun mereka masih memiliki nilai default. Akibatnya, sering kali ada panggilan yang tidak produktif ke cache. Menambahkan pengambil textAlignyang tidak mengizinkan null, itu membantu untuk memperbaiki kesalahan caching, menghasilkan peningkatan kinerja rendering teks 14 kali dalam kasus teks yang di-cache.



Mulailah hari ini!



Versi beta Dart dan Flutter yang berisi null-safety sudah siap. Jika Anda menulis di Flutter, Anda dapat beralih ke beta dengan flutter channel betadan kemudian flutter upgrade. Dan jika Anda tidak menggunakan Flutter, Anda bisa mendapatkan Dart SDK mandiri dari arsip Dart SDK .



Jika Anda mengembangkan paket, kami sarankan untuk membaca panduan migrasi kami dan merencanakan migrasi Anda. Harap beritahu kami tentang masalah atau saran yang Anda miliki.



Jika Anda seorang pengembang aplikasi, Anda dapat menunda port sampai fitur tersebut tiba di rilis stabil kami. Kami berencana untuk segera menanggapi umpan balik beta dan memperbaiki masalah yang tersisa. Sulit untuk memberikan garis waktu spesifik kapan null-safety akan dirilis dalam rilis stabil, tetapi kami memikirkannya awal tahun depan.



Terima kasih atas dukungan dan masukan Anda! Kami sedang berupaya membuat Dart menjadi bahasa yang lebih kuat dan Flutter sebagai kerangka kerja yang lebih andal.



Michael Thomsen, Manajer Produk Dart dan Flutter, memposting artikel ini di Blog resmi Dartlang. Jika Anda ingin mendengarkan pembicaraan Michael dan berinteraksi dengannya secara langsung, datanglah ke DartUP 2020 Online pada tanggal 4 dan 5 Desember dan diskusikan pembaruan bahasa terbaru dengan tim Dart dan komunitas.



All Articles