{"record":{"id":"c793be0c583c4bc4","repo":"dotnet/maui","slug":"renderer-c793be","errorCode":null,"errorMessage":"renderer","messagePattern":"renderer","errorType":"exception","errorClass":"ArgumentNullException","httpStatus":null,"severity":"error","filePath":"src/Compatibility/Core/src/iOS/EventTracker.cs","lineNumber":49,"sourceCode":"\t\treadonly NotifyCollectionChangedEventHandler _collectionChangedHandler;\n\n\t\treadonly Dictionary<IGestureRecognizer, NativeGestureRecognizer> _gestureRecognizers = new Dictionary<IGestureRecognizer, NativeGestureRecognizer>();\n\n\t\treadonly IVisualElementRenderer _renderer;\n\n\t\tbool _disposed;\n\t\tNativeView _handler;\n\n\t\tdouble _previousScale = 1.0;\n#if __MOBILE__\n\t\tUITouchEventArgs _shouldReceiveTouch;\n\t\tDragAndDropDelegate _dragAndDropDelegate;\n#endif\n\n\t\tpublic EventTracker(IVisualElementRenderer renderer)\n\t\t{\n\t\t\tif (renderer == null)\n\t\t\t\tthrow new ArgumentNullException(nameof(renderer));\n\n\t\t\t_collectionChangedHandler = ModelGestureRecognizersOnCollectionChanged;\n\n\t\t\t_renderer = renderer;\n\t\t\t_renderer.ElementChanged += OnElementChanged;\n\t\t}\n\n\t\tObservableCollection<IGestureRecognizer> ElementGestureRecognizers\n\t\t{\n\t\t\tget\n\t\t\t{\n\t\t\t\treturn ((_renderer?.Element as IGestureController)\n\t\t\t\t\t\t\t?.CompositeGestureRecognizers as ObservableCollection<IGestureRecognizer>);\n\t\t\t}\n\t\t}\n\n\t\tinternal void Disconnect()\n\t\t{","sourceCodeStart":31,"sourceCodeEnd":67,"githubUrl":"https://github.com/dotnet/maui/blob/f377ff1c5ee04d334d8a925f50c83a6b7afddf03/src/Compatibility/Core/src/iOS/EventTracker.cs#L31-L67","documentation":"EventTracker constructor throws ArgumentNullException(nameof(renderer)) when the IVisualElementRenderer is null. EventTracker attaches gesture-recognizer collection-changed handling to a renderer's element; without a renderer there is no element to track, so construction is rejected immediately.","triggerScenarios":"Constructing EventTracker with a null renderer; typically only inside custom renderers that build an EventTracker before Platform.GetRenderer returns a value.","commonSituations":"A custom renderer instantiating EventTracker during constructor execution before the renderer is fully initialized; passing renderer from a GetRenderer call that returned null because the element was not registered.","solutions":["Create EventTracker only after the renderer is fully initialized and assigned.","Verify the renderer is non-null before constructing EventTracker.","Move EventTracker initialization to OnElementChanged / the ElementChanged event."],"exampleFix":"// before\n_tracker = new EventTracker(null);\n// after\nif (renderer == null)\n    throw new InvalidOperationException(\"Renderer not ready.\");\n_tracker = new EventTracker(renderer);","handlingStrategy":"validation","validationCode":"if (renderer == null)\n    throw new InvalidOperationException(\"Renderer is not ready; cannot create EventTracker.\");\nvar tracker = new EventTracker(renderer);","typeGuard":"static bool IsRendererReady(IVisualElementRenderer r) => r?.Element != null;","tryCatchPattern":null,"preventionTips":["Construct EventTracker after the renderer is initialized.","Move EventTracker setup to OnElementChanged.","Null-check the renderer before construction."],"tags":["maui","xamarin-forms","ios","event-tracker","gesture","argument-validation"],"backgroundTag":null,"analyzedSha":"f377ff1c5ee04d334d8a925f50c83a6b7afddf03","analyzedAt":"2026-08-13T14:26:18.069Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}