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
Enum
s wirdname
verwendet statt dem langentoString()
Rückgabewert.
- Grundstruktur:
- Unterklassen können
super.debugProperties
wiederverwenden 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
addDebugProperties
zu implementieren. - Könnte genutzt werden um mehrzeilige, indentierte String Representation für
alle
ToStringHelper
Klassen 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,
};
}