モバイルアプリケーションのDart2.12への移行(Flutter 2)

2021年3月3日、Google開発者はFlutter 2を発表しました。新しいバージョンのDart言語には何が登場しましたか?以前のFlutterバージョンを使用して作成されたアプリケーションの開発とサポートについてはどうですか?そして最も重要なことは、バージョン2への移行はどれほど難しいでしょうか。この記事では、アプリケーションを新しいバージョンのFlutterに移行する際の経験と、移行中に発生する可能性のある問題について詳しく説明します。 





Flutterとは誰ですか?Flutterが必要な理由は何ですか?

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