Nice Write up!
There is another option, or better, a way to complement your third option.
The State class has a ‘didUpdateWidget()’ that is called whenever the widget definition changes. You need to override this method to respond to widget changes. The build() method is always called after calling ‘didUpdateWidget()’ so no need to call setState().