Sry if this reply is little bit of topic, but I think that using multiple Sprite2D nodes per state (idle, walk, etc.) and toggling visible is generally a bad pattern (referencing post that you mentioned). It duplicates render nodes, splits animation state between code and the animation system, and quickly becomes hard to maintain or extend (especially with more states or layers).
A cleaner approach is to use AnimatedSprite2D with multiple animations (via SpriteFrames) and using AnimationPlayer (+ AnimationTree) as the orchestrator. This keeps animation state centralized and scales much better (especially if you have different outfits for a player).
In short you can have one AnimatedSprite2D that have multiple animations referencing multiple spritesheets (walk animation will reference walk spritesheet, idle animation will reference idle spritesheet, …) In that way AnimatedSprite2D is just container for all animations. And you can use AnimationPlayer to animate AnimatedSprite2D by animating it’s frames 
Here is my (more complex setup where I have multiple AnimatedSprite2D for player parts/outfits - but in your case you can just have one AnimatedSprite2D) :
TorsoSprite is AnimatedSprite2D having different animations that can reference different spritesheets:
Instead of using AnimatedSprite2D play method you will use AnimationPlayer to animate sprite by animating ‘animation’ and ‘frame’ properties
You can use “idle_down” directly from AnimationPlayer or using AnimationTree to transition between walk, idle, … and other states.
In your case, hierarchy can look like:
Player
-> AnimatedSprite2D
-> AnimationPlayer
-> AnimationTree (optional)
Fill AnimatedSprite2D SpriteFrames with all animations that you can have (they can reference different spritesheets). And than use AnimationPlayer to animate AnimatedSprite2D.
It has little overhead but it scales nicely later on. At the end you do not need extra code to show/hide sprites and manages drawing states - everything is controlled form AnimationPlayer/AnimationTree.