classSpacecraft{Stringname;DateTime?launchDate;// Read-only non-final property
int?getlaunchYear=>launchDate?.year;// Constructor, with syntactic sugar for assignment to members.
Spacecraft(this.name,this.launchDate){// Initialization code goes here.
}// Named constructor that forwards to the default one.
Spacecraft.unlaunched(Stringname):this(name,null);// Method.
voiddescribe(){print('Spacecraft: $name');// Type promotion doesn't work on getters.
varlaunchDate=this.launchDate;if(launchDate!=null){intyears=DateTime.now().difference(launchDate).inDays~/365;print('Launched: $launchYear ($years years ago)');}else{print('Unlaunched');}}}// 使用类
varvoyager=Spacecraft('Voyager I',DateTime(1977,9,5));voyager.describe();varvoyager3=Spacecraft.unlaunched('Voyager III');voyager3.describe();
Future<void>describeFlybyObjects(List<String>flybyObjects)async{try{for(finalobjectinflybyObjects){vardescription=awaitFile('$object.txt').readAsString();print(description);}}onIOExceptioncatch(e){print('Could not describe object: $e');}finally{flybyObjects.clear();}}