Dart 2.18: Interop Objective-C & Swift
Interoperabilitas yang ditingkatkan, jaringan khusus platform, inferensi jenis yang ditingkatkan, dan pembaruan penting pada peta jalan bahasa keamanan null kami
Dart 2.18 tersedia hari ini. Rilis ini menampilkan pratinjau interoperabilitas Objective-C & Swift dan paket jaringan iOS/macOS baru yang dibangun di atas interop ini. Ini juga berisi peningkatan inferensi tipe untuk fungsi umum, peningkatan kinerja untuk kode async, fitur pub.dev baru, dan pembersihan alat dan pustaka inti kami.
Terakhir, kami memiliki nomor status migrasi keamanan nol terbaru dan pembaruan peta jalan penting di jalur kami menuju Dart aman sepenuhnya nol. Silahkan baca sampai akhir!
Memperkenalkan Dart ke interop Objective-C & Swift
Kami mempratinjau antarmuka fungsi asing Dart (FFI) untuk memanggil API C asli pada tahun 2020 dan merilisnya di Dart 2.12 pada Maret 2021. Sejak rilis tersebut, banyak pilihan paket telah memanfaatkan fitur ini untuk berintegrasi dengan API C asli yang ada. Beberapa contoh termasuk file_picker, printing, win32, objectbox, realm, isar, tflite_flutter, dan dbus.
Tim Dart ingin Dart mendukung interoperabilitas dengan semua bahasa utama di platform tempat Dart berjalan. Dart 2.18 memenuhi tonggak berikutnya menuju tujuan itu. Kode Dart Anda dapat memanggil kode Objective-C dan Swift, seperti yang biasanya digunakan untuk API di platform macOS dan iOS. Dart mendukung mekanisme interop ini di aplikasi apa pun dari aplikasi CLI hingga kode backend ke UI Flutter.
Mekanisme baru ini memanfaatkan fakta bahwa kode Objective-C dan Swift dapat diekspos sebagai kode C berdasarkan pengikatan API. Alat pembuat pembungkus Dart API, ffigen, dapat membuat pengikatan ini dari header API. Mari kita lihat sebuah contoh.
Contoh Zona Waktu menggunakan Objective-C
macOS memiliki API untuk menanyakan informasi zona waktu yang diekspos di NSTimeZonekelas . Anda dapat mengkueri API ini untuk offset zona waktu dan zona waktu UTC yang telah dikonfigurasi pengguna untuk perangkat mereka.
Contoh aplikasi Objective-C berikut menggunakan API zona waktu ini untuk mendapatkan zona waktu sistem dan offset GMT:
Aplikasi mengimpor Foundation.h, yang berisi header API untuk pustaka Apple Foundation. Selanjutnya, di dalam mainmetode, ia memanggil systemTimeZonemetode dari NSTimeZonekelas. Metode ini mengembalikan NSTimeZoneinstance dengan zona waktu yang dipilih pada perangkat. Terakhir, aplikasi mengeluarkan dua baris ke konsol yang berisi nama zona waktu dan offset UTC dalam hitungan jam.
Jika Anda menjalankan aplikasi ini, aplikasi tersebut akan mengembalikan sesuatu yang menyerupai berikut ini, bergantung pada lokasi Anda:
Timezone name: Europe/Copenhagen
Timezone offset GMT: 2 hours
Mari replikasi hasil ini dengan Dart menggunakan interop Objective-C yang baru.
Pertama buat aplikasi Dart CLI baru:
$ dart create timezones
Ini memilih binding Objective-C untuk header NSTimeZone.hdan hanya menyertakan API di NSTimeZoneantarmuka. Untuk menghasilkan pembungkus, jalankan ffigen:
$ dart run ffigen
Itu dia! Dukungan baru ini tersedia dalam status percobaan yang dimulai dengan Dart 2.18 hari ini. Ini meningkatkan dukungan interop umum Dart untuk memanggil API macOS dan iOS secara langsung. Ini, pada gilirannya, melengkapi plugin Flutter, dengan dukungan baru yang berfungsi di semua aplikasi Dart, dan memungkinkan Anda untuk memanggil API macOS dan iOS langsung dari kode Dart.
Kami menyambut umpan balik Anda. Beri tahu kami apa yang berhasil, apa yang mungkin diubah, atau masalah apa yang Anda alami dengan memberi komentar di masalah umpan balik di GitHub. Untuk mempelajari lebih lanjut tentang interoperabilitas ini, lihat panduan interoperabilitas Objective-C dan Swift .
Pustaka http khusus platform
Dart menyertakan perpustakaan umum multi-platform http. Pustaka ini memungkinkan Anda untuk menulis kode tanpa memperhatikan spesifikasi platform. Terkadang, Anda mungkin ingin menulis kode khusus untuk API jaringan platform host tertentu.
Misalnya, perpustakaan jaringan Apple NSURLSessionmemungkinkan menentukan jaringan hanya WiFi atau memerlukan VPN. Untuk mendukung kasus penggunaan ini, kami telah membuat paket jaringan baru yang ditujukan untuk platform macOS dan iOS, cupertino_http. Ini dibangun di atas interop Objective-C baru yang disebutkan di bagian sebelumnya. Ini menggunakan sekumpulan besar pembungkus API yang dihasilkan dari API jaringan Apple di Foundation.
Contoh perpustakaan Cupertino http
Contoh berikut menyetel klien http aplikasi Flutter untuk menggunakan cupertino_httppustaka di macOS dan iOS dan pustaka http reguler Dart dari dart:ioplatform lain:
Setelah konfigurasi awal ini, aplikasi membuat panggilan jaringan berikutnya pada klien tertentu. Misalnya, get()permintaan http sekarang menyerupai ini:
Saat Anda tidak dapat menggunakan antarmuka klien umum, Anda dapat memanggil API jaringan Apple secara langsung menggunakan perpustakaan cupertino_http:
Jaringan khusus platform di aplikasi multi-platform
Saat kami merancang fitur ini, tujuannya tetap untuk menjaga aplikasi multi-platform mungkin. Untuk memenuhi tujuan ini, kami mempertahankan httpset API multi-platform umum kami untuk operasi http dasar, dan memungkinkan untuk mengonfigurasi per-platform yang akan digunakan oleh pustaka jaringan. Anda dapat meminimalkan jumlah kode khusus platform yang perlu ditulis dengan menggunakan package:httpAPI Klien . API ini dapat dikonfigurasi per platform tetapi digunakan dengan cara yang tidak tergantung platform.
Dart 2.18 menawarkan dukungan eksperimental dari dua pustaka http khusus platform yang mendukung package:http API Klien :
cupertino_httpberdasarkanNSURLSessionuntuk macOS/iOS.cronet_httpberdasarkan Cronet , pustaka jaringan yang populer di Android.
Inferensi tipe yang ditingkatkan
Dart menggunakan banyak fungsi generik. Pertimbangkan foldmetode, yang mengurangi kumpulan elemen menjadi satu nilai. Contoh berikut menghitung jumlah daftar bilangan bulat:
List<int> numbers = [1, 2, 3];
final sum = numbers.fold(0, (x, y) => x + y);
print(‘The sum of $numbers is $sum’);
line 2 • The operator ‘+’ can’t be unconditionally invoked because the receiver can be ‘null’.
final sum = numbers.fold(0, (int x, int y) => x + y);
Peningkatan kinerja asinkron
Versi Dart ini meningkatkan cara Dart VM menerapkan asyncmetode dan fungsi async*/ sync*generator. Ini mengurangi ukuran kode. Pada dua aplikasi Google internal yang besar, kami melihat pengurangan ukuran snapshot AOT sekitar 10%. Kami juga melihat peningkatan kinerja di seluruh microbenchmark kami.
Perubahan ini mencakup perubahan perilaku kecil tambahan; untuk mempelajari lebih lanjut, lihat changelog .
perbaikan pub.dev
Sehubungan dengan rilis 2.18, kami telah membuat dua perubahan pada pub.devrepositori paket.
Orang sering menyimpan paket yang dipublikasikan pub.devdi waktu luang mereka. Ini bisa mahal, baik dalam hal waktu dan keuangan. Untuk memfasilitasi pensponsoran, kami sekarang mendukung tag baru fundingdi pubspec, yang dapat digunakan oleh penerbit paket untuk mencantumkan tautan ke satu atau lebih cara mensponsori paket. Tautan ini kemudian ditampilkan pub.devdi sidebar:
Untuk mempelajari lebih lanjut, lihat pubspecdokumentasi .
Selain itu, kami ingin mendorong ekosistem paket sumber terbuka yang kaya. Untuk menyorot ini, penilaian paket otomatis pada pub.devpenghargaan tambahan 10 poin untuk paket yang menggunakan lisensi yang disetujui OSI .
Beberapa perubahan yang merusak
Dart memiliki fokus yang kuat pada kesederhanaan dan kemampuan belajar. Kami terus berusaha menjaga keseimbangan saat menambahkan kemampuan baru. Salah satu metode untuk menjaga hal-hal sederhana adalah menghapus fungsi dan API lama dengan sedikit penggunaan atau penggantian yang lebih baik. Dart 2.18 membersihkan item dalam kategori ini, termasuk beberapa perubahan yang lebih kecil:
- Kami menambahkan
dartalat pengembang CLI terpadu pada Oktober 2020. Di 2.18, kami menyelesaikan transisi. Rilis ini menghapus dua alat terakhir yang tidak digunakan lagidart2js(usedart compile js) dandartanalyzer(usedart analyze). - Dengan pengenalan versi bahasa,
pubmenghasilkan file resolusi baru:.dart_tool/package_config.json.File sebelumnya,.packages, menggunakan format yang tidak dapat berisi versi. Kami berhenti menggunakan.packagesfile. Jika Anda memiliki.packagesfile apa pun, Anda dapat menghapusnya. - Mixin kelas yang tidak diperluas
Objecttidak dapat digunakan (melanggar perubahan #48167 ). Perilaku ini tidak pernah dimaksudkan. - Properti
uridaridart:io'sRedirectExceptiontelah diubah menjadi nullable (melanggar perubahan #49045 ). - Konstanta dalam
dart:ioAPI jaringan yang mengikuti konvensi SCREAMING_SNAKE telah dihapus (melanggar perubahan #34218 ; sebelumnya tidak digunakan lagi). Gunakan konstanta lowerCamelCase yang sesuai sebagai gantinya. - Dart VM tidak lagi memulihkan pengaturan terminal awal saat keluar. Program yang mengubah
StdinpengaturanlineModedanechoModesekarang bertanggung jawab untuk memulihkan pengaturan saat program keluar (melanggar perubahan #45630 ).
Kami sangat senang melihat penggunaan keamanan nol secara luas sejak rilis beta pada November 2020 dan rilis Dart 2.12 pada Maret 2021.
Pertama, pengembang aplikasi dari hampir semua paket populer di pub.devmigrasi ke keamanan nol. Analisis menunjukkan bahwa 100% dari 250 teratas dan 98% dari 1.000 paket teratas yang paling banyak digunakan mendukung keamanan nol.
Kedua, sebagian besar pengembang aplikasi bekerja dalam basis kode dengan migrasi keamanan null penuh. Ini sangat penting. Keamanan null suara penuh Dart tidak bekerja sampai Anda memigrasikan semua kode dan semua dependensi (termasuk transitif). Kami melacak ini melalui telemetri dari flutter runperintah.
Grafik berikut menunjukkan eksekusi keamanan nihil yang tidak sehat vs. tidak sehat dari flutter run. Sebelum pengenalan keamanan nol, keduanya tidak ada. Pertumbuhan pesat dari keamanan nol yang tidak sehat diikuti. Saat aplikasi mulai bermigrasi ke keamanan nol, pengembang melakukan migrasi sebagian. Beberapa bagian masih perlu dipindahkan. Seiring waktu, kami melihat pertumbuhan yang sangat sehat dari sesi keamanan null yang sehat. Pada akhir bulan lalu, ada empat kali lebih banyak sesi keselamatan nol yang sehat dibandingkan dengan sesi yang tidak sehat. Kami berharap, selama beberapa kuartal berikutnya, kita akan melihat pendekatan keamanan nol suara 100%!
Pembaruan peta jalan keamanan nol yang penting
Mendukung keamanan nol yang tidak sehat dan tidak sehat menambah biaya overhead dan kompleksitas.
Pertama, pengembang Dart perlu mempelajari dan memahami kedua mode tersebut. Setiap kali membaca sepotong kode Dart, periksa versi bahasa untuk melihat apakah jenisnya non-null secara default (Dart 2.12 dan lebih baru) atau nullable secara default (Dart 2.11 dan lebih lama).
Kedua, mendukung kedua mode di compiler dan runtime kami memperlambat pengembangan Dart SDK untuk mendukung fitur baru.
Berdasarkan overhead keamanan nol yang tidak sehat dan angka adopsi yang sangat positif yang disebutkan di bagian sebelumnya, tujuan kami adalah untuk beralih ke hanya mendukung keamanan nol yang sehat dan menghentikan mode keamanan non-nol dan keamanan nol yang tidak sehat. Kami telah menjadwalkan ini untuk dirilis pada pertengahan 2023.
Ini berarti menghentikan dukungan untuk Dart 2.11 dan sebelumnya. File Pubspec dengan batasan SDK yang memiliki batas bawah kurang dari 2.12 tidak akan lagi diselesaikan di Dart 3 dan yang lebih baru. Dalam kode sumber yang berisi penanda bahasa, itu akan gagal jika diatur ke kurang dari 2.12 (seperti // @dart=2.9).
Jika Anda telah bermigrasi ke keamanan null yang terdengar, kode Anda akan berfungsi dengan keamanan null penuh di Dart 3. Jika belum, harap migrasikan sekarang! Untuk mempelajari lebih lanjut tentang perubahan ini, lihat masalah GitHub ini .
Ringkasan
Dukungan baru untuk interop, jaringan, inferensi tipe, dan pub.devtersedia saat ini. Untuk memulai, Anda dapat langsung mengunduh rilis Dart 2.18 , atau menyematkannya sebagai bagian dari rilis SDK Flutter 3.3 hari ini .

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































