You could use your first widget-tree and apply the following changes:
In every ListView and GridView set shrinkWrap: true. This fixes the error message you were getting.
In every ListView and GridView set physics: NeverScrollableScrollPhysics(). This disables the scroll on them and new you can only scroll on the SingleChildScrollView
As suggested by other answers, you can do that by setting shrinkWrap: true, physics: NeverScrollableScrollPhysics(), but building a shrinkwrapped listview is more expensive than building a normal listview, I think it will be a good idea to use a map() on the list.
It happens because Column and ListView both take the entire space of screen individually which is there default behavior.
How to solve the problem?
To solve the above problem we have to disable scrolling of Listview, This can be possible by shrinkWrap and physics property
shrinkWrap:true - It forces ListView to take only the required space, not the entire screen.
physics: NeverScrollableScrollPhysics() - It disables scrolling functionality of ListView, which means now we have only SingleChildScrollView who provide the scrolling functionality.