Migrasi aplikasi seluler ke Dart 2.12 (Flutter 2)

Pada 3 Maret 2021, pengembang Google memperkenalkan Flutter 2. Apa yang muncul di versi baru bahasa Dart? Bagaimana dengan pengembangan dan dukungan aplikasi yang dibuat menggunakan versi Flutter sebelumnya sekarang? Dan yang terpenting, seberapa sulit untuk bermigrasi ke versi 2? Dalam artikel ini, kami akan menjelaskan secara detail pengalaman migrasi aplikasi ke versi baru Flutter dan masalah yang mungkin muncul selama migrasi. 





Siapa Flutter dan mengapa Flutter dibutuhkan?

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