In cases where you need control over the layout,
  painting, and hit testing, consider defining a
  custom RenderBox.

Wrap your background Image widget with a
Flow widget.

Introduce a new FlowDelegate called ParallaxFlowDelegate.

A FlowDelegate controls how its children are sized
and where those children are painted. In this case,
your Flow widget has only one child: the background 
image. That image must be exactly as wide as the Flow widget.

Return tight width constraints for your background image child.

Your background images are now sized appropriately.
But, you still need to calculate the vertical position
of each background image based on its scroll 
position, and then paint it.

There are three critical pieces of information that
you need to compute the desired position of a
background image:

The bounds of the ancestor Scrollable

The bounds of the individual list item