Я работаю с кодом Dart для класса Flutter/Dart, который я беру. Я ожидал, что следующий код скомпилируется, но этого не произошло:
class Person {
String? name;
int? age;
Person(this.name, this.age);
@override
String toString() {
return "name: $name\nage: $age";
}
}
void main() {
final person = Person(name: 'Joe', age: 30);
print(person);
}
Когда я сделал параметры конструктора необязательными, как показано ниже, он компилируется:
class Person {
String? name;
int? age;
Person({this.name, this.age});
@override
String toString() {
return "name: $name\nage: $age";
}
}
void main() {
final person = Person(name: 'Joe', age: 30);
print(person);
}
Я попытался найти в документации разработчиков Flutter причину, по которой это так, или способ иметь необходимые параметры с их именами в конструкторе, но ничего не нашел. Я, конечно, могу представить случаи, когда я хотел бы, чтобы требуемые параметры конструктора имели имена.
В моем pubspec.yaml указано следующее:
environment: sdk: ">=2.12.0 <3.0.0"
В вашем первом примере используются так называемые «позиционные параметры» в dart. Вы не можете вызвать позиционный параметр с меткой имени, поэтому первый пример не компилируется.
Во втором примере используются «именованные параметры». Любой параметр, определенный в {}, считается именованным параметром и должен вызываться с использованием метки имени. Как объяснялось в туре по языку дартс, именованные параметры являются необязательными, если они явно не помечены как required.
Поэтому просто добавьте ключевое слово required перед любым именованным параметром, который вы хотите запросить.
class Person {
String? name;
int? age;
Person({required this.name, required this.age});
@override
String toString() {
return "name: $name\nage: $age";
}
}
void main() {
final person = Person(name: 'Joe', age: 30);
print(person);
}
Я плохо отсутствую в документах; спасибо, что терпите мою неопытность!