Null-Sicherheit ist natürlich ein wichtiger Schritt bei der Entwicklung der Sprache. Das Dart-Team hat eine Beta-Version der Null-Safety-Version angekündigt! Wir haben die Nachrichten zu dieser Version ins Russische übersetzt, in denen Sie lernen, wie Sie auf neue Versionen migrieren, welche Vorteile Sie erhalten und welche Vorteile die Nullsicherheit für uns alle bietet.
Heute geben wir bekannt, dass für Dart und Flutter eine zuverlässige Null-Sicherheits-Beta verfügbar ist. Null-Sicherheit ist unser jüngster wichtiger Fortschritt, mit dem Sie Fehler vermeiden können, die auf Null verweisen. Diese Fehlerklasse ist häufig schwer zu erkennen. Dieses Video erklärt allgemein den Grund für unsere Freude:
Mit der Umstellung auf die Null-Sicherheits-Beta ist es Zeit, die Tausenden von Paketen zu migrieren, die auf pub.dev verfügbar sind . Wir haben die Dart-Kernbibliotheken, das Flutter-Framework und über 40 Dart- und Flutter-Pakete portiert . Trotzdem hoffen wir, dass die Community durch die Migration ihrer Pakete die Nullsicherheit akzeptiert.
Mit der Beta-Version betreten wir auch die Zielgerade, bevor die stabile Version ohne Sicherheit veröffentlicht wird. Wir hoffen, dass Sie diese Funktionalität nutzen und uns mitteilen, ob wir sie verbessern und die UI-Meldungen und -Dokumentationen klarer gestalten können. Wir freuen uns auf Ihr Feedback .
Null-Sicherheit wählen
Bevor wir uns mit der Migration auf Nullsicherheit befassen, möchten wir noch einmal betonen, dass Sie (wie in unseren Nullsicherheitsrichtlinien angegeben ) genau auswählen können, wann die Migration gestartet werden soll. Apps und Pakete funktionieren nur dann mit Null-Sicherheit, wenn das Mindestlimit für Dart SDK mindestens der Vorabversion von Dart 2.12 entspricht:
environment:
sdk: ">=2.12.0-0 <3.0.0"
Versuchen Sie es mit einer kleinen Null-Sicherheits-Hallo-App (z. B. mit
dart create), die den unten gezeigten Code enthält. Sie können dann versuchen, die Anwendung vor und nach dem Ändern des SDK-Limits auszuführen und zu starten, um zu dart pub getsehen, wie sich das Verhalten des Programms ändert. (Stellen Sie sicher, dart --versiondass Sie genau 2.12 an Sie zurücksenden).
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;
^
Auf Null-Sicherheit umsteigen
Befolgen Sie diese fünf Schritte, die im Migrationshandbuch für dart.dev beschrieben sind, um ein Paket (oder eine einfache Anwendung) in den Nullsicherheitsmodus zu migrieren.
Schritt 1: Überprüfen Sie, ob Ihre Abhängigkeiten bereit sind
Es wird dringend empfohlen, den Code in der richtigen Reihenfolge zu verschieben, beginnend mit den "Blättern" des Abhängigkeitsdiagramms. Wenn beispielsweise C von B abhängt, was von A abhängt, migrieren Sie zuerst zu Nullsicherheit A, dann zu B und dann zu C. Diese Reihenfolge gilt unabhängig davon, ob A, B und C Bibliotheken, Pakete oder Anwendungen sind.
Warum ist Ordnung so wichtig? Sie können einige Fortschritte bei der Migration Ihres Codes erzielen, bevor Sie Ihre Abhängigkeiten migrieren. Sie laufen jedoch Gefahr, erneut ausgeführt werden zu müssen, wenn Ihre Abhängigkeiten während der Migration ihre Schnittstellen ändern. Wenn einige Ihrer Abhängigkeiten nicht null-sicher sind, können Sie die Paketverleger über die Kontaktdaten kontaktieren, die für jedes Paket auf pub.dev aufgeführt sind.
Überprüfen, ob Abhängigkeiten bereit sind
Um zu überprüfen, ob Ihre Anwendung oder Ihr Paket für die Migration bereit ist, können Sie
dart pub outdatedim Null-Sicherheitsmodus ausgeführt werden. Das folgende Beispiel zeigt , dass die Anwendung für die Migration bereit sein wird , wenn es seine Abhängigkeiten aktualisiert zu path, processund pedanticzu, die Pre-Release - Versionen in der aufgelisteten auflösbaren Spalte .
Wenn in neueren Nebenversionen keine Sicherheitsunterstützung verfügbar ist, werden diese in der Spalte Aktualisierbar angezeigt . In wichtigen Neuerscheinungen ist häufig keine Sicherheitsunterstützung verfügbar. In diesem Fall werden die im Abschnitt " Auflösbar" aufgeführten Versionen in der Ausgabe des veralteten Dienstprogramms angezeigt . Um zu ihnen zu wechseln, bearbeiten Sie die Datei
pubspec.yaml, um diese Hauptversionen zuzulassen. Zum Beispiel können Sie ändern
process: ^3.0.13zu process: ^4.0.0-nullsafety.
Sie können auch die neue Verwendung von Paketen mit null-Sicherheits Unterstützung auf pub.dev finden Sicherheit Null - Tags auf Paket - Seiten (z Sammlung 1,15 ) und die neue erweiterte null Sicherheit Suchoption
Schritt 2: Übertragung mit dem Migrationstool
Sobald die Abhängigkeiten fertig sind, können Sie mit dem Migrationstool mit der Migration Ihrer Anwendung oder Ihres Pakets beginnen
dart migrate.
Das Migrationstool ist interaktiv, sodass Sie die von diesem Tool abgeleiteten Nullsicherheitseigenschaften anzeigen können. Wenn Sie mit einem Ergebnis des Tools nicht einverstanden sind, können Sie Nullhinweise hinzufügen, um es zu ändern. Das Hinzufügen einiger Hinweise kann einen großen Einfluss auf die Qualität Ihrer Migration haben.
Mehrere Autoren von Dart-Paketen haben Migrationen mit frühen Null-Sicherheits-Pre-Builds getestet, und ihr Feedback war ermutigend. Das Migrationshandbuch enthält zusätzliche Tipps zur Verwendung des Migrationstools.
Schritt 3: Statische Analyse des portierten Codes
Aktualisieren Sie Pakete mit pub get in Ihrer IDE oder Befehlszeile. Verwenden Sie dann eine IDE oder eine Befehlszeile, um eine statische Analyse Ihres Dart-Codes durchzuführen:
$ dart pub get
$ dart analyze
Oder im Flattercode:
$ flutter pub get
$ flutter analyze
Schritt 4: Stellen Sie sicher, dass die Tests bestanden sind
Führen Sie Tests durch und stellen Sie sicher, dass sie sicher bestehen. Möglicherweise müssen Sie Tests aktualisieren, bei denen null erwartet wird, wenn Sie Ihren Paketcode so ändern, dass keine Nullwerte zulässig sind.
Schritt 5: Veröffentlichen Sie Ihr Null-Sicherheitspaket
Nach Abschluss der Migration und Ausführen der Tests können Sie Ihr Paket als Vorabversion veröffentlichen. Hier ist eine Zusammenfassung der Best Practices:
- Aktualisieren Sie die Version auf die nächste Hauptversion (z. B. von
2.3.xbis3.0.0). Dadurch wird sichergestellt, dass Benutzer Ihres Pakets erst dann ein Upgrade durchführen, wenn sie bereit sind, die Null-Sicherheit zu verwenden. Dies gibt Ihnen die Freiheit, Ihre API umzugestalten, um die Null-Sicherheit optimal zu nutzen. - Übersetzen und veröffentlichen Sie Ihr Paket als Vorschau auf pub.dev . (Verwenden Sie zum Beispiel
3.0.0-nullsafety.0eher als3.0.0.)
Weitere Informationen zur Migration und Versionierung finden Sie im Migrationshandbuch .
Vorteile der garantierten Nullsicherheit
In unseren vorherigen Beiträgen zu technischen Vorschauen ohne Sicherheit in Dart und Flutter wurden die Vorteile dieser Änderungen anhand einer Reihe von Beispielen erörtert. Jetzt, da die Nullsicherheit kurz vor dem Abschluss steht, sehen wir einige Beispiele aus der Praxis für diesen Vorteil.
Sichererer Code
Wir haben kürzlich einen Fehler im Hauptzweig Flutter entdeckt, der dazu führte, dass verschiedene Werkzeugbefehle
flutterbei bestimmten Maschinenkonfigurationen mit einem Fehler null: abstürzten The method '>=' was called on null. Das Hauptproblem war eine kürzlich erfolgte Pull-Anfrage, um Unterstützung für die Erkennung von Android Studio 4.1 hinzuzufügen. Diese Pull-Anfrage fügte folgenden Code hinzu:
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) {
...
Kannst du einen Fehler finden? Da die Version null sein kann, können sowohl die Haupt- als auch die Nebenversion ebenfalls null sein. Dieser Fehler mag hier isoliert leicht zu finden sein, aber in der Praxis rutscht diese Art von Code selbst bei dem strengen Codeüberprüfungsprozess, der im Flutter-Repository verwendet wird, ständig durch. Bei der Nullsicherheit erkennt die statische Analyse dieses Problem sofort :
Es war ein ziemlich einfacher Fehler. In den frühen Tagen der Verwendung von Null-Sicherheit im internen Code von Google haben wir gesehen, wie viel komplexere Fehler erkannt und dann durch Null-Sicherheit behoben wurden. Hier sind einige Beispiele:
- , null , null-safety null. , protobuf, , , null. , , - null .
- Google Pay Flutter, - Flutter
StateWidget. null-safety null ; null-safety , null, . - Flutter , - Flutter , null
sceneWindow.render(). null-safety , Scene , , null.
null-safety
Die Nullsicherheit von Dart ist ebenfalls wichtig: Dart-Compiler können Nullsicherheitsinformationen nutzen. Es kann Ihre Programme kleiner und schneller machen. Bisher haben wir nicht viele reale Anwendungen, die vollständig in Null-Sicherheit übersetzt wurden (schließlich beginnen wir gerade erst mit der Migration des Ökosystems von Paketen, von denen diese Anwendungen für die Zuverlässigkeit abhängen), aber wir sehen sehr ermutigende Ergebnisse aus dem Hauptframework.
Wir haben kürzlich eine Test-Neukompilierung des hello_world- Beispiels durchgeführt , um die Auswirkung der Nullsicherheit auf die Anwendungsgröße zu messen. Dies ist ein minimales Beispiel, das nur "Hallo Welt" anzeigt. Beim VergleichVon der Gesamtgröße des kompilierten Codes wurde die Größe des unkomprimierten (auf dem Gerät installierten) Codes um 3,5% reduziert, ohne dass andere Aktionen als die Neukompilierung mit zuverlässiger Nullsicherheit durchgeführt wurden. Dies war trotz der Tatsache möglich, dass die gesamte Anwendung aus 10 Codezeilen bestand, da die Codegröße aller enthaltenen Bibliotheken reduziert wurde. Beispielsweise ist das Flutter (
package:flutter) - Framework selbst um 3,9% geschrumpft.
In Bezug auf die Codegeschwindigkeit erhöht das Erzwingen eines vertrauenswürdigen Datentypsystems möglicherweise den Overhead. Weniger Nullprüfungen beschleunigen jedoch möglicherweise auch Ihren Code. Die erste Analyse der Benchmarks zeigt, dass die Leistung mit früheren Versionen vergleichbar ist, und neue zusätzliche Typinformationen bieten uns das Potenzial für neue Möglichkeiten zur Verbesserung der Leistung in der Zukunft. Wir planen, in zukünftigen Veröffentlichungen mehr darüber zu schreiben.
In einigen Fällen haben wir bereits gesehen, wie Nullsicherheit zu Leistungssteigerungen führte, als der Übergang einen Fehler in der Codelogik feststellte. Beispielsweise haben wir ein Problem im Textpositionierungscache des Flutter-Webs gefunden. Dieser Cache verwendete einen nullbaren Schlüssel und wurde dann gemäß der gegebenen Logik verwendet
TextAlign.startwenn null. Diese Logik hat einen Cache-Fehler ausgelöst, bei dem Elemente so aussahen, als hätten sie sich geändert, obwohl sie immer noch einen Standardwert hatten. Infolgedessen gab es häufig unproduktive Aufrufe des Caches. Wenn Sie einen Getter hinzufügen textAlign, der keine Null zulässt, wird das Fehler-Caching korrigiert, was in Fällen, in denen Text zwischengespeichert wird, zu einer 14-fachen Steigerung der Renderleistung des Texts führt.
Fangen Sie noch heute an!
Die Beta-Versionen von Dart und Flutter mit Null-Sicherheit sind fertig. Wenn Sie in Flutter schreiben, können Sie mit
flutter channel betaund dann zur Beta wechseln flutter upgrade. Und wenn Sie Flutter nicht verwenden, können Sie das eigenständige Dart SDK aus dem Dart SDK-Archiv herunterladen .
Wenn Sie Pakete entwickeln, empfehlen wir Ihnen, unseren Migrationsleitfaden zu lesen und Ihre Migration zu planen. Bitte teilen Sie uns Ihre Probleme oder Vorschläge mit.
Wenn Sie ein App-Entwickler sind, können Sie den Port verschieben, bis die Funktion in unseren stabilen Versionen verfügbar ist. Wir planen, schnell auf Beta-Feedback zu reagieren und verbleibende Probleme zu beheben. Es ist schwierig, ein bestimmtes Datum anzugeben, an dem Null-Safety in einer stabilen Version veröffentlicht wird, aber wir denken über den Beginn des nächsten Jahres nach.
Vielen Dank für Ihre Unterstützung und Ihr Feedback! Wir arbeiten daran, Dart zu einer robusteren Sprache und Flutter zu einem leistungsfähigeren Framework zu machen.
Michael Thomsen, Produktmanager für Dart und Flutter, hat diesen Artikel im offiziellen Dartlang-Blog veröffentlicht. Wenn Sie Michaels Vortrag anhören und persönlich mit ihm sprechen möchten , besuchen Sie DartUP 2020 Online am 4. und 5. Dezember und besprechen Sie die neuesten Sprachaktualisierungen mit dem Dart-Team und der Community.