あいどんノート

日々疑問に思ったことや得られた知見を書きなぐります!

Fragment Over Flow

こんにちは。

最近更新できていなかったわけですが、書いていきたいと思います。

今日アプリを作成していて、Fragmentにアニメーションつけた際に気づいてしまったことがあります。

Fragmentの遷移にnavigationを使っているのですが、フラグメントが重なって行っている。

どういうことかと言いますと、Fragmentを理解していれば当たり前のことではあるんですが、Fragmentの管理はStackのような管理になっていて、LIFOのデータ構造になっています。

navigateで遷移する際には、遷移先のフラグメントを新しく生成しています。

画面を戻る際にメインフラグメントにnavigateをしてしまうとメインフラグメントを新たに生成してスタックに積み上げていくことになってしまいます。

わかりやすく説明すると、メインとサブ二つのフラグメントがあるとします。

スタックの初めの中身はメインだけです。()の中身はスタックの中身とします。

(メイン)

そこでサブにnavigateします。

(メイン → サブ)

サブで処理を終えた後メインにnavigateすると

(メイン → サブ → メイン)

となってメインが2個存在することになります。

これをN回繰り返すとN+1個メインが生成されます。地獄です。

これを起こさないためには、遷移先から遷移元に戻る際はpopBackStack()を使用しましょう。

 

データ更新されなくなったが?

という問題が発生することが考えられます。

要はサブで更新した内容がメインで表示されていないと言った内容です。

これは今まで新しくメインを生成したために更新されていたが、以前のメインを表示するようにしたために昔のデータ表示のままと言ったことから生まれるものです。

これに関しては簡単で、FragmentにはonResume()という関数(?)が存在しています。

これはライフサイクルを勉強していただくとわかることなのですが、Fragmentを再表示した際に呼び出される関数となっています。

ここにデータをアーキテクチャやデータフローを考えて適切にリロードする処理を書いてあげることで、アーキテクチャを守って、スタックマシマシから守ってコードをかけます。

 

これでStack Over FlowいいえFragment Over Flowなコードを卒業しましょう(自戒)