Migration of a mobile application to Dart 2.12 (Flutter 2)

On March 3, 2021, Google developers introduced Flutter 2. What has appeared in the new version of the Dart language? What about the development and support of applications created using previous Flutter versions now? And most importantly, how difficult would it be to migrate to version 2? In this article, we will describe in detail the experience of migrating an application to a new version of Flutter and the problems that may arise during the migration process. 





Who is Flutter and why is Flutter needed?

, , 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