Dart 2.18: Interoperabilità Objective-C e Swift
Interoperabilità migliorata, rete specifica per piattaforma, inferenza del tipo migliorata e un importante aggiornamento sulla nostra roadmap del linguaggio di sicurezza null
Dart 2.18 è disponibile oggi. Questa versione presenta un'anteprima dell'interoperabilità di Objective-C e Swift e un nuovo pacchetto di rete iOS/macOS basato su questa interoperabilità. Contiene inoltre un'inferenza del tipo migliorata per funzioni generiche, miglioramenti delle prestazioni del codice asincrono, nuove funzionalità di pub.dev e pulizia dei nostri strumenti e librerie di base.
Infine, abbiamo gli ultimi numeri sullo stato della migrazione di sicurezza nulla e un importante aggiornamento della tabella di marcia sul nostro percorso verso un Dart sicuro completamente nullo. Si prega di leggere fino alla fine!
Presentazione dell'interoperabilità Dart con Objective-C e Swift
Abbiamo visualizzato in anteprima l'interfaccia per funzioni esterne Dart (FFI) per chiamare le API C native nel 2020 e l'abbiamo rilasciata in Dart 2.12 a marzo 2021. Da quella versione, un'ampia selezione di pacchetti ha sfruttato questa funzionalità per l'integrazione con le API C native esistenti. Alcuni esempi includono file_picker, printing, win32, objectbox, realm, isar, tflite_fluttere dbus.
Il team di Dart desidera che Dart supporti l'interoperabilità con tutte le lingue principali sulle piattaforme su cui viene eseguito Dart. Dart 2.18 raggiunge il prossimo traguardo verso quell'obiettivo. Il tuo codice Dart può chiamare il codice Objective-C e Swift, come in genere utilizzato per le API sulle piattaforme macOS e iOS. Dart supporta questo meccanismo di interoperabilità in qualsiasi app, dall'app CLI al codice di back-end a un'interfaccia utente Flutter.
Questo nuovo meccanismo sfrutta il fatto che il codice Objective-C e Swift può essere esposto come codice C basato su associazioni API. Lo strumento di generazione del wrapper dell'API Dart, ffigen, può creare queste associazioni dalle intestazioni dell'API. Diamo un'occhiata a un esempio.
Esempio di fuso orario utilizzando Objective-C
macOS dispone di un'API per interrogare le informazioni sui fusi orari esposte nella NSTimeZoneclasse . Puoi eseguire una query su questa API per il fuso orario e la differenza di fuso orario UTC che l'utente ha configurato per il proprio dispositivo.
L'app Objective-C di esempio seguente utilizza questa API del fuso orario per ottenere il fuso orario del sistema e l'offset GMT:
L'app imports Foundation.h, che contiene le intestazioni API per la libreria Apple Foundation. Successivamente, all'interno del mainmetodo, chiama il systemTimeZonemetodo dalla NSTimeZoneclasse. Questo metodo restituisce NSTimeZoneun'istanza con il fuso orario selezionato sul dispositivo. Infine, l'app restituisce alla console due righe contenenti il nome del fuso orario e l'offset UTC in ore.
Se esegui questa app, dovrebbe restituire qualcosa di simile al seguente, a seconda della tua posizione:
Timezone name: Europe/Copenhagen
Timezone offset GMT: 2 hours
Replichiamo questo risultato con Dart usando la nuova interoperabilità Objective-C.
Per prima cosa crea una nuova app Dart CLI:
$ dart create timezones
Questo seleziona le associazioni Objective-C per le intestazioni NSTimeZone.he include solo le API nell'interfaccia NSTimeZone. Per generare i wrapper, eseguire ffigen:
$ dart run ffigen
Questo è tutto! Questo nuovo supporto è disponibile in uno stato sperimentale a partire dall'odierna Dart 2.18. Ciò potenzia il supporto dell'interoperabilità generale di Dart per chiamare direttamente le API macOS e iOS. Questo, a sua volta, integra i plug-in di Flutter, con un nuovo supporto che funziona in qualsiasi app Dart e che consente di chiamare le API macOS e iOS direttamente dal codice Dart.
Accogliamo con favore il tuo feedback. Facci sapere cosa ha funzionato, cosa potrebbe essere cambiato o quali problemi hai riscontrato commentando il problema di feedback su GitHub. Per ulteriori informazioni su questa interoperabilità, consulta la Guida all'interoperabilità tra Objective-C e Swift .
Librerie http specifiche della piattaforma
Dart include una libreria generale multipiattaforma http. Questa libreria consente di scrivere codice senza preoccuparsi delle specifiche della piattaforma. Occasionalmente, potresti voler scrivere codice specifico per le API di rete di una particolare piattaforma host.
Ad esempio, la libreria di rete di Apple NSURLSessionconsente di specificare la rete solo WiFi o che richiede una VPN. Per supportare questi casi d'uso, abbiamo creato un nuovo pacchetto di rete destinato alle piattaforme macOS e iOS, cupertino_http. Questo si basa sulla nuova interoperabilità Objective-C menzionata nella sezione precedente. Utilizza un ampio set di wrapper API generati dalle API di rete di Apple in Foundation.
Esempio di libreria http di Cupertino
L'esempio seguente imposta il client http di un'app Flutter in modo che utilizzi la cupertino_httplibreria su macOS e iOS e la normale libreria http di Dart da dart:ioaltre piattaforme:
Dopo questa configurazione iniziale, l'app effettua tutte le successive chiamate di rete sul client specifico. Ad esempio, una get()richiesta http ora è simile a questa:
Quando non puoi utilizzare l'interfaccia client comune, puoi chiamare direttamente le API di rete di Apple utilizzando la cupertino_httplibreria:
Rete specifica della piattaforma in app multipiattaforma
Quando abbiamo progettato questa funzione, l'obiettivo è rimasto quello di mantenere le app il più multipiattaforma possibile. Per raggiungere questo obiettivo, abbiamo mantenuto la nostra API multipiattaforma generale httpimpostata per le operazioni http di base e consentito la configurazione per piattaforma quale libreria di rete utilizzare. Puoi ridurre al minimo la quantità di codice specifico della piattaforma che devi scrivere utilizzando l' package:httpAPI client . Questa API può essere configurata per piattaforma ma utilizzata in modo indipendente dalla piattaforma.
Dart 2.18 offre il supporto sperimentale di due librerie http specifiche della piattaforma che supportano l' package:http API client :
cupertino_httpbasato suNSURLSessionper macOS/iOS.cronet_httpbasato su Cronet , la libreria di rete popolare su Android.
Inferenza del tipo migliorata
Dart utilizza molte funzioni generiche. Considera il foldmetodo, che riduce una raccolta di elementi a un singolo valore. L'esempio seguente calcola la somma di un elenco di numeri interi:
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);
Miglioramenti delle prestazioni asincrone
Questa versione di Dart migliora il modo in cui Dart VM applica il asyncmetodo e le funzioni async*/ sync*generatore. Ciò riduce la dimensione del codice. Su due grandi app Google interne, abbiamo riscontrato una riduzione delle dimensioni dell'istantanea AOT di circa il 10%. Abbiamo anche visto un aumento delle prestazioni nei nostri microbenchmark.
Queste modifiche includono ulteriori piccoli cambiamenti di comportamento; per saperne di più, consulta il changelog .
miglioramenti pub.dev
In concomitanza con la versione 2.18, abbiamo apportato due modifiche al pub.devrepository dei pacchetti.
Gli individui spesso mantengono i pacchetti pubblicati pub.devnel loro tempo libero. Questo può essere costoso, sia in termini di tempo che di finanze. Per facilitare le sponsorizzazioni ora supportiamo un nuovo fundingtag in pubspec, che può essere utilizzato dagli editori di pacchetti per elencare collegamenti a uno o più modi di sponsorizzare il pacchetto. Questi collegamenti vengono quindi visualizzati pub.devnella barra laterale:
Per saperne di più, consulta la pubspecdocumentazione .
Inoltre, vorremmo incoraggiare un ricco ecosistema di pacchetti open source. Per evidenziare questo, il punteggio del pacchetto automatizzato pub.devassegna altri 10 punti per i pacchetti che utilizzano una licenza approvata dall'OSI .
Alcune modifiche sostanziali
Dart si concentra fortemente sulla semplicità e sull'apprendimento. Cerchiamo costantemente di mantenere un attento equilibrio quando aggiungiamo nuove funzionalità. Un metodo per mantenere le cose semplici è rimuovere le funzionalità e le API storiche con scarso utilizzo o sostituzioni migliori. Dart 2.18 ripulisce gli elementi in questa categoria, incluse alcune piccole modifiche importanti:
- Abbiamo aggiunto lo
dartstrumento per sviluppatori CLI unificato nell'ottobre 2020. Nella versione 2.18 abbiamo completato la transizione. Questa versione rimuove gli ultimi due strumenti deprecatidart2js(usedart compile js) edartanalyzer(usedart analyze). - Con l'introduzione del controllo delle versioni della lingua,
pubgenera un nuovo file di risoluzione:.dart_tool/package_config.json.il file precedente,.packages, utilizzava un formato che non poteva contenere versioni. Abbiamo smesso di usare il.packagesfile. Se hai dei.packagesfile, puoi eliminarli. - I mixin di classi che non si estendono
Objectnon possono essere utilizzati (modifica di rottura #48167 ). Questo comportamento non è mai stato previsto. - La
uriproprietà didart:io'sRedirectExceptionè stata modificata in nullable (modifica di rilievo #49045 ). - Le costanti nelle
dart:ioAPI di rete di che seguono la convenzione SCREAMING_SNAKE sono state rimosse (modifica di rottura #34218 ; precedentemente deprecata). Utilizzare invece le corrispondenti costanti lowerCamelCase. - Dart VM non ripristina più le impostazioni iniziali del terminale all'uscita. Programmi che modificano le
StdinimpostazionilineModeeechoModeora sono responsabili del ripristino delle impostazioni all'uscita dal programma (modifica di rottura #45630 ).
Siamo molto lieti di vedere l'ampio utilizzo della sicurezza nulla dalla sua versione beta nel novembre 2020 e dalla versione Dart 2.12 nel marzo 2021.
Innanzitutto, gli sviluppatori di app di quasi tutti i pacchetti popolari sono pub.devmigrati a sicurezza nulla. L'analisi mostra che il 100% dei primi 250 e il 98% dei primi 1.000 pacchetti più utilizzati supportano la sicurezza nulla.
In secondo luogo, la maggior parte degli sviluppatori di app lavora in codebase con migrazione di sicurezza null completa. Questo è fondamentale. La sicurezza null del suono completo di Dart non si attiva fino a quando non si esegue la migrazione di tutto il codice e di tutte le dipendenze (incluso il transitivo). Lo stiamo monitorando tramite la telemetria dai flutter runcomandi.
Il grafico seguente mostra le esecuzioni di sicurezza null non valide rispetto a quelle valide di flutter run. Prima dell'introduzione della sicurezza nulla, non c'era nessuno dei due. Seguì una rapida crescita di sicurezza nulla malsana. Quando le app hanno iniziato a migrare verso la sicurezza nulla, gli sviluppatori hanno effettuato una migrazione parziale. Alcune parti dovevano ancora essere migrate. Nel corso del tempo, assistiamo a una crescita molto salutare di sessioni di sicurezza nulle valide. Alla fine del mese scorso, c'erano quattro volte più sessioni di sicurezza nulle valide rispetto a quelle non valide. Ci auguriamo che, nei prossimi trimestri, vedremo il solido approccio nullo alla sicurezza al 100%!
Un importante aggiornamento della roadmap sulla sicurezza nulla
Il supporto della sicurezza nulla sia non valida che valida aggiunge sovraccarico e complessità.
Innanzitutto, gli sviluppatori di Dart devono imparare e comprendere entrambe le modalità. Ogni volta che leggi un pezzo di codice Dart, controlla la versione della lingua per vedere se i tipi sono non null per impostazione predefinita (Dart 2.12 e versioni successive) o nullable per impostazione predefinita (Dart 2.11 e versioni precedenti).
In secondo luogo, il supporto di entrambe le modalità nei nostri compilatori e runtime rallenta l'evoluzione di Dart SDK per supportare nuove funzionalità.
Sulla base dell'overhead di una sicurezza nulla non valida e dei numeri di adozione molto positivi menzionati nella sezione precedente, il nostro obiettivo è passare al supporto solo della sicurezza nulla valida e interrompere la sicurezza non nulla e le modalità di sicurezza nulla non valida. Abbiamo provvisoriamente previsto il rilascio entro la metà del 2023.
Ciò significherebbe interrompere il supporto per Dart 2.11 e versioni precedenti. I file Pubspec con un vincolo SDK con un limite inferiore inferiore a 2,12 non sarebbero più risolti in Dart 3 e versioni successive. Nel codice sorgente contenente indicatori di lingua, quelli fallirebbero se impostati su un valore inferiore a 2.12 (come // @dart=2.9).
Se hai eseguito la migrazione a Sound Null Safety, il tuo codice funzionerà con la piena Null Safety in Dart 3. In caso contrario, esegui la migrazione ora! Per ulteriori informazioni su queste modifiche, vedere questo problema di GitHub .
Riepilogo
Il nuovo supporto per l'interoperabilità, la rete, l'inferenza del tipo ed pub.devè già disponibile. Per iniziare, puoi scaricare direttamente la versione Dart 2.18 o incorporarla come parte della versione odierna dell'SDK Flutter 3.3 .

![Che cos'è un elenco collegato, comunque? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































