diff --git a/packages/flutter/lib/src/rendering/mouse_tracker.dart b/packages/flutter/lib/src/rendering/mouse_tracker.dart index 0e2234107ee7..b83d332301d8 100644 --- a/packages/flutter/lib/src/rendering/mouse_tracker.dart +++ b/packages/flutter/lib/src/rendering/mouse_tracker.dart @@ -319,7 +319,8 @@ class MouseTracker extends ChangeNotifier { // so that [mouseIsConnected], which is decided by `_mouseStates`, is // correct during the callbacks. if (existingState == null) { - assert(event is! PointerRemovedEvent); + if (event is PointerRemovedEvent) + return; _mouseStates[device] = _MouseState(initialEvent: event); } else { assert(event is! PointerAddedEvent); diff --git a/packages/flutter/test/rendering/mouse_tracker_test.dart b/packages/flutter/test/rendering/mouse_tracker_test.dart index 9ddae1e9505d..8e445b3c08a2 100644 --- a/packages/flutter/test/rendering/mouse_tracker_test.dart +++ b/packages/flutter/test/rendering/mouse_tracker_test.dart @@ -133,6 +133,16 @@ void main() { listenerLogs.clear(); }); + // Regression test for https://github.com/flutter/flutter/issues/90838 + test('should not crash if the first event is a Removed event', () { + final List events = []; + setUpWithOneAnnotation(logEvents: events); + ui.window.onPointerDataPacket!(ui.PointerDataPacket(data: [ + _pointerData(PointerChange.remove, Offset.zero), + ])); + events.clear(); + }); + test('should correctly handle multiple devices', () { final List events = []; setUpWithOneAnnotation(logEvents: events);