Overlayが消えない!!
overlayを削除したい場合に以下のようにOverlayEntry.remove()を呼び出すことが通常だと思う。しかし、これを呼び出しているにも関わらすOverlayが消えないという事象が発生した。その症状が発生したときには_entryはnullとなっており、なんで_entryがnullになっているの消えないの?という疑問にはまったので、備忘録として残しておく。
if (_entry != null){
_entry.remove();
_entry = null;
}
Overlayが消えない原因
この記事が参考になった。簡単にいうと、removeが走る前にOverlayのinsertが誤って2回以上呼ばれるとremoveしても消えなくなるということ。
なるほど、自分はonTapの中にinsertをいれていたため、連続2回タップするとinsertが2回呼ばれてしまい、Overlayが消えなくなると理解できた。
解決策
それじゃあ、どうやって防ごうかという話になるわけだが、参考記事では、以下のようなプログラムが提案されていた。
WidgetsBinding.instance.addPostFrameCallback((_) => overlayState.insert(_entry));
だが、しかし、自分の場合は直らなかった...。
そこで、考えたのが以下のようなプログラムである。
if (_entry==null){
_entry = OverlayEntry(....);
WidgetsBinding.instance.addPostFrameCallback(
(_) => Overlay.of(context).insert(_overlayEntry!));
}
簡単にいうと、_entryがnullだった場合にのみinsertをするようにした。これにより、1回のみしか追加されないようにした。
(並列処理なのでもしかしたらこのnull判定を抜けて2回呼ばれる可能性があるかもしれない...、
でも高速タップしてテストしてみたけど、今のところちゃんと消えているので、コンピュータレベルの時間間隔でinsertを呼び出すようなことをしなければよっぽど大丈夫かと?)。