Hari ini di Google I/O, kami mengumumkan Dart SDK baru, versi 2.17. Rilis ini dibangun di atas tema inti kami tentang produktivitas dan portabilitas platform terdepan. Rilis ini menawarkan fitur bahasa baru: enum dengan dukungan anggota, penerusan parameter yang ditingkatkan ke super class, dan banyak fleksibilitas untuk parameter bernama. Kami telah meningkatkan alat dengan versi utama package:lints
terbaru — dukungan alat untuk memeriksa kode Dart terhadap praktik terbaik kami — dan banyak update dokumentasi API library inti dengan contoh kode beragam. Untuk integrasi platform yang lebih baik, kami punya template baru untuk penggunaan dart:ffi
(interop C native) di plugin Flutter, dukungan eksperimental untuk prosesor RISC-V, dan dukungan untuk menandatangani file macOS dan Windows yang dapat dieksekusi.
Fitur bahasa baru untuk meningkatkan produktivitas
Kami terus mengembangkan bahasa Dart untuk membuat Anda semakin produktif — baik dengan menambahkan fitur baru maupun dengan menyempurnakan fitur yang sudah ada. Dart 2.17 menambahkan dukungan utama baru untuk anggota pada enum, menyempurnakan cara Anda menggunakan argumen bernama dalam konstruktor, dan membuat kode untuk meneruskan parameter ke superclass jauh lebih ringkas dan tidak repetitif.
Enum yang ditingkatkan dengan anggota
Enum sangat bagus untuk merepresentasikan kumpulan status terpisah. Sebagai contoh, kita mungkin memodelkan air sebagai enum Water { frozen, lukewarm, boiling }
. Namun bagaimana jika kita ingin menambahkan beberapa metode pada enum
— misalnya, untuk mengubah setiap status menjadi suhu, dan mendukung konversi enum
ke String
? Kita mungkin bisa menggunakan metode ekstensi untuk menambahkan metode waterToTemp()
, tetapi kita harus berhati-hati untuk menjaganya tetap sinkron dengan enum
. Untuk konversi String
, kami lebih suka mengganti toString()
, tetapi ini belum didukung.
Dengan Dart 2.17 kami sekarang memiliki dukungan umum untuk anggota enum. Ini berarti kita bisa menambahkan status fields holding, konstruktor yang mengatur status tersebut, metode dengan fungsionalitas, bahkan mengganti anggota yang sudah ada. Banyak yang meminta kemampuan tersebut; ini adalah masalah dengan suara tertinggi ketiga dalam tracker bahasa.
Untuk contoh air tersebut, kita bisa menambahkan kolom int
yang memiliki suhu dan konstruktor default yang memuat int
:
enum Water {
…
final int tempInFahrenheit;
const Water(this.tempInFahrenheit);
}
Untuk memastikan konstruktor dipanggil saat enum
dibuat, kita harus memanggilnya untuk setiap nilai enum
:
enum Water {
frozen(32),
lukewarm(100),
boiling(212);
…
}
Untuk mendukung konversi ke String
, kita cukup mengganti toString
, yang diwarisi enums
dari Object
:
@override
String toString() => "The $name water is $tempInFahrenheit F.";
Dan dengan itu, Anda memiliki enum
lengkap yang bisa dengan mudah dipakai membuat instance dan Anda dapat memanggil metode dari sana:
void main() {
print(Water.frozen); // Prints “The frozen water is 32 F.”
}
Contoh lengkap dari kedua pendekatan diilustrasikan di bawah ini; kami menemukan versi Dart 2.17 yang baru jauh lebih mudah dibaca dan dipelihara.
Super initializer
Saat Anda memiliki hierarki pewarisan class, pola umumnya adalah meneruskan beberapa parameter konstruktor ke konstruktor superclass. Untuk melakukannya, sub-class harus 1) membuat daftar setiap parameter dalam konstruktornya sendiri, dan 2) memanggil konstruktor super dengan parameter tersebut. Ini mengarah ke kode boilerplate: banyak repetisi, membuat kode sulit dibaca dan lebih merepotkan dipelihara.
Beberapa anggota komunitas Dart membantu mewujudkan hal ini. Pengguna GitHub @roy-sianez melaporkan masalah bahasa terkait hal ini sekitar setengah tahun yang lalu; ia menyarankan sesuatu yang mirip dengan saran dari pengguna GitHub @apps-transround sebelumnya: kita mungkin dapat menyelesaikannya dengan memperkenalkan konstruksi baru untuk menyatakan bahwa parameter telah ditentukan di super class. Kami berpikir itu adalah ide yang bagus, jadi ini telah ditambahkan ke Dart 2.17. Seperti yang Anda lihat dari contoh berikut, ini sangat relevan untuk kode widget Flutter. Bahkan, ketika kami menerapkan fitur baru ke framework Flutter, kami melihat pengurangan total hampir dua ribu baris kode!
Argumen bernama di mana-mana
Terakhir, kami telah menyempurnakan cara kerja argumen bernama saat Anda memanggil sebuah metode. Sebelumnya, ini harus muncul terakhir dalam daftar argumen pada metode. Ini tentu menjengkelkan terutama ketika Anda lebih suka menempatkan argumen posisional terakhir agar kode lebih mudah dibaca. Sebagai contoh, lihat pemanggilan konstruktor List<T>.generate
— sebelumnya, argumen growable harus ditempatkan di posisi terakhir, sehingga mudah terlewat di bawah argumen posisional besar yang berisi generator. Sekarang Anda bisa mengurutkannya sesuai keinginan, sehingga Anda bisa menempatkan argumen bernama kecil terlebih dahulu dan generator ditempatkan di posisi terakhir.
Untuk melihat lebih banyak contoh dari ketiga fitur ini beraksi, lihat contoh terbaru kami untuk enum, super initializer, dan parameter bernama.
Alat produktivitas
Melanjutkan tema produktivitas, kami melakukan beberapa penyempurnaan pada alat inti kami.
Dalam Dart 2.14 kami memperkenalkan package:lints
, yang bekerja dengan penganalisis Dart untuk membantu Anda menulis kode Dart yang mencegah kesalahan dan menggunakan gaya canonical yang memungkinkan tinjauan kode yang lebih efektif. Sejak itu, sejumlah lint baru telah tersedia di penganalisis, yang telah kami urutkan dengan cermat dan memilih sepuluh lint baru untuk semua kode Dart, dan dua lint baru khusus untuk kode Flutter. Ini termasuk lint untuk memastikan impor disertakan dalam file pubspec Anda, untuk mencegah penyalahgunaan null check pada parameter tipe, dan memastikan gaya yang konsisten untuk properti turunan. Anda bisa mengupgrade ke lint baru dengan perintah sederhana:
- Untuk paket Dart:
dart pub upgrade —-major-versions lints
- Untuk paket Flutter:
flutter pub upgrade —-major-versions flutter_lints
SecureSockets biasanya digunakan untuk mengaktifkan soket TCP yang diamankan dengan TLS dan SSL. Sebelum Dart 2.17, men-debug soket ini selama pengembangan memang cukup rumit, karena tidak ada cara untuk memeriksa traffic data yang aman. Kami sekarang telah menambahkan dukungan untuk menetapkan file keyLog
. Jika sudah ditetapkan, satu baris teks dalam NSS Key Log Format akan ditambahkan ke file saat kunci TLS baru ditukarkan dengan server. Ini memungkinkan alat penganalisis traffic jaringan (seperti Wireshark) untuk mendekripsi konten yang dikirim melalui soket. Untuk detailnya, lihat dokumen API untuk SecureSocket.connect()
.
Dokumentasi API yang dihasilkan oleh alat dart doc
adalah aset penting bagi kebanyakan developer Dart yang mempelajari API baru. Meskipun API library inti kami telah lama memiliki deskripsi tekstual yang beragam, banyak developer memberi tahu kami bahwa mereka lebih suka mempelajari API dengan membaca kode contoh yang menggunakan API. Dengan Dart 2.17, kami telah merombak total semua library inti utama, menambahkan kode contoh ke 200 halaman teratas yang paling banyak dilihat, sehingga mereka sekarang memiliki kode contoh yang lengkap. Sebagai contoh, bandingkan dokumentasi untuk dart:convert di Dart 2.16 dengan halaman yang diperbarui untuk Dart 2.17; semoga ini membuat dokumentasi lebih mudah dipelajari.
Peningkatan produktivitas tidak hanya datang saat kami menambahkan fitur baru ke platform kami, tetapi juga saat kami membersihkan stack dan menghapus fitur yang tidak lagi digunakan. Ini membantu menjaga area permukaan kami kecil, yang sangat penting terutama bagi developer baru. Untuk itu, kami telah menghapus 231 baris kode yang tidak digunakan lagi dari library dart:io
— jika Anda masih menggunakan API yang tidak digunakan lagi ini, Anda bisa melakukan upgrade ke penggantinya dengan dart fix
. Kami juga melanjutkan upaya untuk menghapus alat Dart CLI yang tidak digunakan lagi, kali ini kami menghapus alat dartdoc
(gunakan dart doc
sebagai gantinya), dan alat pub
(gunakan dart pub
atau flutter pub
).
Memperluas integrasi dan dukungan platform kami
Tema inti kedua adalah integrasi dan dukungan platform. Dart adalah bahasa multiplatform sejati. Meskipun kami telah mendukung berbagai platform, kami terus berkembang untuk memastikan bahwa Anda bisa terintegrasi secara mendalam dengan setiap platform yang didukung, dan juga untuk mendukung platform yang muncul.
Dart FFI — mekanisme inti kami untuk interop dengan kode native/C — adalah cara terpopuler untuk mengintegrasikan kode Dart dengan kode platform native yang sudah ada. Di Flutter, ini bisa menjadi cara terbaik untuk membuat plugin yang menggunakan API native dari platform host (seperti API win32 Windows). Di Dart 2.17 dan Flutter 3, kami telah menambahkan template ke alat flutter
sehingga sekarang Anda bisa dengan mudah membuat Plugin FFI yang memiliki Dart API yang didukung oleh panggilan dart:ffi
ke dalam kode native. Untuk detailnya, lihat pembaruan halaman pengembangan paket dan plugin di flutter.dev.
Untuk mengaktifkan penggunaan FFI pada platform yang memiliki tipe khusus untuk ABI (application binary interface), FFI sekarang mendukung tipe khusus ABI. Sebagai contoh, sekarang Anda bisa menggunakan Long
(long
dalam C) untuk merepresentasikan integer panjang secara benar dengan ukuran khusus ABI, yang mungkin 32-bit atau 64-bit tergantung arsitektur CPU. Untuk daftar dukungan tipe selengkapnya, lihat daftar “Implementer’’ di halaman API AbiSpecificInteger
.
Ketika terintegrasi secara mendalam dengan platform native menggunakan Dart FFI, terkadang Anda perlu menyelaraskan pembersihan memori atau sumber daya lain (port, file, dan sebagainya) yang dialokasikan oleh Dart dan kode native. Ini secara historis sangat rumit, karena Dart adalah bahasa pengumpulan sampah yang secara otomatis menangani pembersihan. Dart 2.17 memecahkan masalah ini dengan memperkenalkan konsep Finalizer, yang mencakup antarmuka penanda Finalizable
untuk “menandai” objek yang tidak boleh diselesaikan atau dihapus terlalu dini, dan class NativeFinalizer
yang dapat dipasangkan ke objek Dart untuk menyediakan panggilan balik saat objek akan dikumpulkan sampahnya. Bersama-sama, mereka menjalankan kode pembersihan dalam kode native dan Dart. Untuk detailnya, lihat deskripsi dan contoh dalam dokumentasi API untuk NativeFinalizer
, atau dokumentasi untuk WeakReferences
dan Finalizer
untuk dukungan serupa dalam kode Dart biasa.
Dukungan kami untuk mengompilasi Dart ke kode native adalah pengaktif inti untuk membuat aplikasi Flutter memiliki performa startup yang bagus dan rendering yang cepat. Kasus penggunaan kedua adalah kemampuan untuk mengompilasi Dart ke file yang dapat dieksekusi dengan dart compile
. File yang dapat dieksekusi ini bisa berjalan mandiri di mesin apa pun tanpa perlu menginstal Dart SDK. Kemampuan baru lain dalam Dart 2.17 adalah dukungan untuk menandatangani file yang dapat dieksekusi, yang memungkinkan penerapan di Windows dan macOS di mana penandatanganan sering kali diperlukan.
Kami juga terus memperluas rangkaian platform yang didukung dengan selalu menjadi yang terdepan dari setiap platform baru yang muncul. RISC-V adalah kumpulan petunjuk inovatif baru untuk prosesor. RISC-V International, sebuah organisasi non-profit global, memiliki spesifikasi RISC-V, membuat kumpulan petunjuk yang bebas dan terbuka. Ini merupakan platform baru, tetapi kami senang dengan potensinya, jadi rilis Linux 2.17.0–266.1.beta
(atau yang lebih baru dari saluran beta kami) menyertakan dukungan eksperimental untuk hal ini. Kami ingin mendengar masukan Anda, jadi harap laporkan masalah atau posting tentang pengalaman Anda!
Mulailah gunakan Dart 2.17!
Kami berharap rilis Dart 2.17 hari ini menggairahkan Anda, meningkatkan produktivitas Anda, dan memungkinkan integrasi platform yang lebih banyak untuk aplikasi Anda. Untuk memulai, Anda bisa langsung mendownload rilis Dart 2.17, atau menyematkannya sebagai bagian dari rilis SDK Flutter 3 hari ini.
Kami juga mengundang Anda untuk melihat konten baru yang kami sediakan untuk Google I/O!
No comments :
Post a Comment