top of page
  • AutorenbildMarkus Kühle

"Do not use BuildContexts across async gaps" - wie lösen?


In der Welt der Flutter-Entwicklung ist die Verwendung von BuildContext ein unverzichtbarer Bestandteil beim Aufbau und der Navigation von Apps oder der bei verschiedenen anderen vom Context abhängigen Funktionen wie z.B. Layoutmessungen oder den ScaffoldMessenger.


Eine spezielle Lint-Regel, bekannt als use_build_context_synchronously, spielt dabei eine wichtige Rolle, indem sie Entwicklern hilft, gängige Fehler zu vermeiden, die bei asynchronen Operationen auftreten können. Seit Dart 2.13.0 verfügbar, zielt diese Regel darauf ab, die korrekte Nutzung von BuildContext zu fördern und potenzielle Crashes der App zu verhindern.


In diesem Code Beispiel soll der Scaffold Messenger direkt nach einer asynchronen Aktion durchgeführt werden. Es erscheint die Meldung "Don't use 'BuildContext's across async gaps.".

Wie kann das gelöst werden?


Grundlagen des BuildContext

Der BuildContext ist ein Konzept, das eng mit dem Widget-Baum in Flutter verknüpft ist. Jedes Widget besitzt einen BuildContext, der als einzigartiger Identifikator im Widget-Baum fungiert. Dieser Kontext ist entscheidend für die Navigation und das Management des Zustands innerhalb einer App. Allerdings kann die Nutzung des BuildContext über asynchrone Lücken hinweg zu unerwarteten Problemen führen.


Die Regel: use_build_context_synchronously

Die Lint-Regel use_build_context_synchronously rät Entwicklern davon ab, BuildContexts über asynchrone Grenzen hinweg zu verwenden. Der Grund dafür ist, dass das Speichern eines BuildContext für eine spätere Nutzung leicht zu schwer diagnostizierbaren Abstürzen führen kann. Asynchrone Lücken, die implizit BuildContext speichern, gehören zu den am leichtesten zu übersehenden Fehlern beim Schreiben von Code.


Was zu vermeiden ist

Die Regel hebt hervor, dass Entwickler den BuildContext nicht über asynchrone Lücken hinweg nutzen sollten. Ein klassisches Beispiel für schlechte Praxis ist das Aufrufen von Navigationsfunktionen nach einer asynchronen Operation, ohne zu überprüfen, ob der BuildContext noch gemountet ist.

In diesem Beispiel kann kann es zu einem Fehler kommen, falls der Build-Context nicht mehr vorhanden ist.

Empfohlene Praktiken

Die Regel betont die Bedeutung der Überprüfung der mounted-Eigenschaft des BuildContext nach einer asynchronen Lücke. Dies gilt insbesondere, wenn der BuildContext durch eine Zustandsklasse (State) oder als lokale Variable bzw. Funktionsargument genutzt wird.


Lösung für das ScaffoldMessenger Beispiel

Bei der Verwendung von ScaffoldMessenger besteht die Möglichkeit sich diesen bereits zu laden bevor die asynchrone Aktion ausgeführt wird und erst anschließend zu verwenden:



Deep Dive in Synchrone Build Contexte

Wer sich noch tiefer mit dem BuildContext beschäftigen möchte dem empfehle ich diese Folge von "Decoding Flutter": Sie dauert lediglich 6 Minuten und sin sehr gut investierte Zeit:




Fazit

Die Einhaltung der use_build_context_synchronously-Regel in Flutter-Projekten ist entscheidend, um eine robuste und crashfreie App-Erfahrung zu gewährleisten. Durch die Beachtung dieser Regel können Entwickler gängige Fallen umgehen und eine zuverlässigere Nutzung des BuildContexts sicherstellen. Letztendlich führt dies zu einer verbesserten App-Qualität und einer effizienteren Entwicklungserfahrung.

bottom of page