0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Flutter】OverlayEntryをremoveしても消えない

Posted at

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を呼び出すようなことをしなければよっぽど大丈夫かと?)。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?