Anstatt toString() zu überschreiben, benutze ToStringHelper:
class Person with ToStringHelper {
Person(this.name, this.age);
final String name;
final int age;
@override
Map<String, Object?> get debugProperties {
return {
'name': name,
'age': age,
};
}
}Vorteile von ToStringHelper:
- Einheitliche Formatierung die sich zentral anpassen lässt:
- Grundstruktur:
Person(name: "Alice", age: 30) - Property Werte werden passend für Typ formatiert:
- Strings werden für bessere Lesbarkeit in Anführungszeichen gesetzt.
- Für
Enums wirdnameverwendet statt dem langentoString()Rückgabewert.
- Grundstruktur:
- Unterklassen können
super.debugPropertieswiederverwenden und müssen nur neue Properties hinzufügen. - Unterklassen nutzen automatisch ihren eigenen Typ Namen in der Ausgabe.
- Ermöglicht Erweiterung:
- Könnte genutzt werden um automatisch Flutter
addDebugPropertieszu implementieren. - Könnte genutzt werden um mehrzeilige, indentierte String Representation für
alle
ToStringHelperKlassen zu implementieren.
- Könnte genutzt werden um automatisch Flutter
Ausnahmen:
- Klassen die eine sehr kompakte String Representation haben sollen, wie z.B.
ein
Point.
Verwende einen Expression Body wenn der Body auf eine Zeile passt:
// Gut
class Person {
Foo(this.name);
final String name;
String get greeting => 'Hello, $name!';
}
// Gut
class Person {
Foo(this.name);
final String name;
String get greeting =>
'Hello $name! This is a very long greeting that will still fit on one line.';
}
// Schlecht
class Person {
Foo(this.name);
final String name;
String get greeting {
return 'Hello, $name!';
}
}Verwende einen Block Body wenn der Body mehr als eine Zeile hat:
// Gut
class Person {
Person(this.name);
final String name;
Map<String, Object?> toJson() {
return {
'name': name,
};
}
}
// Schlecht
class Person {
Person(this.name);
final String name;
Map<String, Object?> toJson() => {
'name': name,
};
}