Files
sure/mobile/test/widgets
ghost 6d3e39e588 fix(mobile): dispose API-key dialog controller on any dismissal (#2399)
* fix(mobile): own the API-key dialog controller in its own State

_showApiKeyDialog created a TextEditingController in the parent State and
only disposed it in the Cancel/Sign-In handlers, so it leaked whenever the
dialog was dismissed via a barrier tap or the system back button.

Disposing it right after `await showDialog` (an earlier attempt) instead
risks disposing the controller while the dialog's TextField is still
mounted during the route's exit transition ("TextEditingController was
used after being disposed").

Extract the dialog into a small StatefulWidget (_ApiKeyLoginDialog) that
owns the controller and disposes it in State.dispose(), tying the
controller's lifecycle to the dialog's widget tree. The dialog pops
true/false/null and the screen shows the error snackbar on a failed
attempt.

flutter analyze: no new issues; flutter test: all green.

* test(mobile): cover ApiKeyLoginDialog controller disposal

Per review: add a widget test for the lifecycle contract that is the core
of this change. Exposes the dialog as `ApiKeyLoginDialog` (@visibleForTesting)
with an injectable controller, and asserts the controller is disposed on
all three dismissal paths — Cancel button, barrier tap, and system back —
by checking that using the controller afterward throws (a disposed
ChangeNotifier throws on reuse).

119 tests pass; flutter analyze: no new issues.

* test(mobile): derive the barrier-tap point from dialog geometry

Per review: replace the hard-coded Offset(10, 10) in the barrier-dismissal
test. Tapping the ModalBarrier widget directly hits the dialog that
occludes its centre, so instead tap halfway between the screen corner and
the dialog's top-left — a point derived from the dialog's real geometry,
resilient to layout changes, and always on the dismissible barrier.

* fix(mobile): keyboard submit + disable Sign In when API key is empty

- Add onSubmitted to the API key TextField so the keyboard Done/Enter key
  submits the form (no need to tap the button).
- Wire a controller listener to rebuild the dialog state and disable the
  Sign In ElevatedButton while the field is blank, giving clear feedback
  before any network call is made.
2026-06-30 07:06:03 +02:00
..