Migration einer mobilen Anwendung auf Dart 2.12 (Flutter 2)

Am 3. März 2021 stellten Google-Entwickler Flutter 2 vor. Was ist in der neuen Version der Dart-Sprache erschienen? Was ist mit der Entwicklung und Unterstützung von Anwendungen, die jetzt mit früheren Flutter-Versionen erstellt wurden? Und vor allem, wie schwierig wäre es, auf Version 2 zu migrieren? In diesem Artikel werden die Erfahrungen bei der Migration einer Anwendung auf eine neue Version von Flutter und die Probleme, die während der Migration auftreten können, ausführlich beschrieben. 





Wer ist Flutter und warum wird Flutter benötigt?

, , 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. «»,   «».





«» . : , , - . .








All Articles