Skip to content

Instantly share code, notes, and snippets.

@blaugold
Created June 19, 2024 12:26
Show Gist options
  • Save blaugold/0192fdfa2af2ef08e471b60f23e8dd06 to your computer and use it in GitHub Desktop.
Save blaugold/0192fdfa2af2ef08e471b60f23e8dd06 to your computer and use it in GitHub Desktop.

Nutze ToStringHelper

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 wird name verwendet statt dem langen toString() Rückgabewert.
  • 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.

Ausnahmen:

  • Klassen die eine sehr kompakte String Representation haben sollen, wie z.B. ein Point.

Expression VS Block Body

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,
      };
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment