Flowを使用した時Hot化する際に思わぬ不具合を発生させてしまったので共有します。DevelopersのFlowのドキュメントに書いてあるような内容です。Hotではストリーム(リソース)の取得と解放のタイミングが異なります。ColdストリームColdストリームはStreamをSubscriptionしたタイミングでリソースの取得やイベントが流されるようになるストリームです。ストリームが使用されなくなると自動的に解放されるようになっていたりすることが多いです。FlowだとchannelFlowなどがこれにあたります。用途としては使用しなくなっタイミングでunregisterする必要があるAPIなどを使用する時に使用します。}}HotストリームHotストリームはSubscriptionの状態に関わらず、リソースの取得やイベントが流されるストリームです。状態を入れておきたい時に使用します。Flowはflowに対してstateInやshareInなどの拡張関数を呼び出すことによってHotストリームに変換することができます。この時にSharingStartedというFlowの購読状態を制御するインスタンスを注入するのですが、こちらの指定を間違うと思わぬ不具合やリソースの解放漏れが発生することがあるので注意が必要です。SharedFlowの違いchannelFlowはSubscribeは1つしかすることができませんが、SharedFlowは複数のSubscribeをサポートしています。StateFlowは複数のSubscribeとLiveDataのように直接値を代入、取り出す機能をサポートしています。ReplaySubjectまた最近ではStateFlowがLiveDataの大替として使用される場面を目にすることが多くなったような気がします。shareInで変換をすることができます。stateInの場合は変数のように値を取り出せる必要性があるため初期値を入れておく必要があります。※初期値を待ってstateInを返すといったこともできます。標準で提供されているSharingStartedにはEagerlyとLazilyとWhileSubscribedがあります。これらをユースケースに応じて適切に使い分ける必要があったのですが、なんとなく使用していたため思わぬ不具合が発生してしまいました。Lazilyの違いとしては開始の条件が違うことが挙げられます。Lazily初期値が流れるタイミングが微妙に違うためEditTextなどのViewと連携する際思わぬ値が流れてクラッシュしたりすることがあるので注意が必要です。LazilyはSubscriptionされなくなっても解放されず、基本的にCoroutineScopeに合わせて解放されるので注意が必要です。WhileSubscribedはsubscriptionCountで取得と解放が行われるので、Subscriptionの状況に応じて解放をしたいときはこちらを使用します。購読状態に合わせて取得、解放を行いたいときはWhileSubscribedを使用する必要があります。shareInを使用する。