Construct runs when a widget is added or removed from a parent or viewport. OnVisibilityChanged does not reflect the actual state of the widget being visible. It might be visible but inside a list that is scrolled down to the bottom, making it invisible to the user. It might be translated off screen etc,.