[flutter]トースト表示の代わり「SnackBar」を使おうとして使わなかった件

シンプルなテキストや通知を表示したい時に便利なトーストですが、flutterでは公式でトースト表示が準備されていません。その代わり、SnackBarという似たようなwidgetが存在するので試してみようかと思ってました!

しかし、調べると色々と問題ありだったので結局採用を見送りました。

理由

その1:Builderでラップする必要がある。

何も考えずに実装すると以下のエラーが出ます。

Unhandled Exception: Scaffold.of() called with a context that does not contain a Scaffold.
No Scaffold ancestor could be found starting from the context that was passed to Scaffold.of(). This usually happens when the context provided is from the same StatefulWidget as that whose build function actually creates the Scaffold widget being sought.
There are several ways to avoid this problem. The simplest is to use a Builder to get a context that is "under" the Scaffold. For an example of this, please see the documentation for Scaffold.of():

簡単に説明すると、コールするタイミングがまずいよって意味です。これを回避するためには、Scafoldのbodyにbuilderを指定し、その中にwidgetを書いていく必要があります。SnackBarを出すためだけに全体の実装を変えるのはどうかと。他の場所でバグを生み出す可能性もありますし。

その2:画面遷移すると消える。

これは試してないので調べた情報なだけなのですが、Scafoldが表示のベースとなっているため、画面遷移すると消えてしまいます。何が問題になるかというと、何かしらのエラーが発生し、画面を終了しながらメッセージを出した時や、ログイン処理の結果を出しながらログイン画面からメニュー画面に遷移した時などです。

実装次第なとこもありますが、感覚的に使えなくなってしまうのはトーストの代わりとは言えないかなと思ってしまいます。

まとめ

トーストぽい事したいなら、素直にFlutterToastを使いましょう。