[Flutter] build前にstateを変更して怒られるときのエラー回避方法

例えば、以下のようなエラーが出た場合

[VERBOSE-2:ui_dart_state.cc(177)] Unhandled Exception: setState() or markNeedsBuild() called during build.
This Overlay widget cannot be marked as needing to build because the framework is already in the process of building widgets.  A widget can be marked as needing to be built during the build phase only if one of its ancestors is currently building. This exception is allowed because the framework builds parent widgets before children, which means a dirty descendant will always be built. Otherwise, the framework might not visit this widget during this build phase.
...

buildの最中にstate変更すな、と怒られている。
setState(){}だけでなく、当然ChangeNotifierのnotifyListeners()等のNotifierのstate変更でもエラーが出る。

まずは処理フローを見直す必要があるが、どうしようもないときは以下の対処法が便利。

WidgetsBinding.instance.addPostFrameCallback((_) {
  // エラーの出ていた処理
});

WidgetsBinding.instance.addPostFrameCallbackはすべてのbuild処理完了後にコールされるため、上記エラーを回避できる。