
Le 3 mars 2021, les développeurs de Google ont présenté Flutter 2. Qu'est-ce qui est apparu dans la nouvelle version du langage Dart? Qu'en est-il du développement et de la prise en charge des applications créées à l'aide des versions précédentes de Flutter maintenant? Et surtout, à quel point serait-il difficile de migrer vers la version 2? Dans cet article, nous décrirons en détail l'expérience de migration d'une application vers une nouvelle version de Flutter et les problèmes pouvant survenir lors de la migration.
Qui est Flutter et pourquoi Flutter est-il nécessaire?
, , Flutter — Google - , Android, iOS . Flutter Web Desktop. , Android iOS, . ? 2018, Flutter 2 .
Flutter 2?
:
Dart 2.12 c «Sound null safety»;
«Flutter for web»;
«Flutter for desktop».
, Flutter 2 , , , , api ?
Web Desktop , «sound null safety» . «sound null safety» ? «Sound null safety» - , Dart 2.12, Flutter 2.0. «null safety», . .
«Sound null safety» Dart null. null , :

. , , , null, « » , «NoSuchMethodError».
«Sound null safety», :
- , , non-nullable, .
- : .
- - non-nullable , null. , «Sound null safety», «sound» «».

, Dart :

Null , . String, . , , , null .
- , null. - String?. : , , , .

:
makeBurger(String burger, [String? meat]) {
if (meat != null) {
print('$burger with $meat');
} else {
print('Vegan $burger'); }
}
«?» , null .
.
Flutter 2. , , — pub.dev. 85% -250 pub.dev «null safety». , , , , pub.dev.
Flutter 2, .
, , Dart Flutter :
flutter upgrade
Flutter’ Dart 2.12.
SDK, Flutter Dart, . AndroidStudio Settings->Plugins. “Update”. .

, , , «null safety». :
dart pub outdated --mode=null-safety
, , pubspec.yaml, . , , , «null safety», . 5 .

Dart , :
dart pub upgrade --null-safety
, …

, device_id «null safety». pub.dev , : 2019. , http ID . , «null safety» , ID , - platform_device_id. , . platform_device_id pubspec.yaml device_id. .
, !
: pubspec.yaml, :
dart pub get
dart pub upgrade
.
: . post() get() http uri, String Uri. Uri.parse().
SDK, , - .
, :
dart migrate

, , , “ ”, , «null safety».
- , . , , .

. - «?» , nullable.

/* no valid migration */
, null, .

, , nullable title:

final, ;
, .
«Add…», String /*!*/, , , non-nullable, , , . , , «meter.customName» ButtonItem «!».

, , , nullable, non-nullable , «!». «» , non-nullable, nullable. «!» null-aware , «?.», «??», «!.» ( ).

ComboMeal(Drink? drink) {
drink!.addIce(); //
}
ComboMeal(null);
«!» , , , «!» , - .
«!» null, . , , meters:

, «!».
, null «» non –nullable . :
ComboMeal(Drink drink) {
if (drink.bestTemperature != null) {
keepTemperature(drink.bestTemperature); //
}
}
ComboMeal(Drink drink) {
int? bestTemperature = drink.bestTemperature;
if (bestTemperature!= null) {
keepTemperature(bestTemperature); // null safety
}
}
, , - , . , .
«?.» – null, . addIce() . , , ?
ComboMeal(Drink? drink) {
drink?.addIce(); // addIce
}
...
ComboMeal(null);
«!» , , «??», null .
ComboMeal(Drink? drink) {
keepTemperature(drink.bestTemperature ?? 70);
}
late.

late nullable , , null . , «burgerName» nullable .
class ComboMeal {
String burgerName; //
void comboWithCheeseburger() {
burgerName = 'heeseburger';
}
void comboWithChickenBurger() {
burgerName = 'Chicken burger';
}
getComboMealName() {
return 'ComboMeal with ' + burgerName;
}
}
, «burgerName» null .
class ComboMeal {
String? burgerName;
void comboWithCheeseburger() {
burgerName = 'heeseburger';
}
void comboWithChickenBurger() {
burgerName = 'Chicken burger';
}
getComboMealName() {
return 'Combo meal with ' + burgerName!;
}
}
late nullable.
class ComboMeal {
late String burgerName; //null safety
void comboWithCheeseburger() {
burgerName = 'heeseburger';
}
void comboWithChickenBurger() {
burgerName = 'Chicken burger';
}
getComboMealName() {
return 'Combo Meal with ' + burgerName;
}
}
ComboMeal comboMeal = ComboMeal();
comboMeal.comboWithCheeseburger();
print(comboMeal.getComboMealName());
, . , , «LateInitializationError» , «burgerName» .
late «» .
class ComboMeal {
late String burgerName = _getSurpriseName();
}
«burgerName» «ComboMeal», . , , , .
? 1200 . - . “Apply Migration”, , .
, . , .
, , /* no valid migration */. , null. .
Dart. :
List<String> words = List<String>();
- , , , null. , nullable . – List.empty(), List.generate(), List.fill(), []. .
, , . , .

, .

100% . , , - - , «null safety». , - , . , , , , .
/ nullable non-nullable, , . nullable « ». , null. , json- , , . , , response- nullable. , .
«late» , . «late», nullable, , , :

.
«null-safety» Dart Dart Flutter , , nullable non-nullable. , Dart 2.12 - nullable non-nullable, non-nullable , nullable .
, . , , . !
P.S. «»
, Flutter 2. «», «».

«» . : , , - . .