追記
新しい記事を書いたのでこちらをご参考ください。 takerpg.hatenablog.jp
内容
Fragment内に ComposeVIew
を作成し、LazyColumn
でリストを表示したが、画面遷移から戻るとスクロール位置が元に戻ってしまう。
どうすればよいか。
TODO
まず、ComposeView.setViewCompositionStrategy
を使ってComposableが破棄されるタイミングをViewのライフサイクルに合わせる
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { return ComposeView(context).apply { setViewCompositionStrategy( ViewCompositionStrategy.DisposeOnLifecycleDestroyed(viewLifecycleOwner) ) } }
次に、rememberLazyListState
で保持させておいたスクロール位置情報をもとに LaunchedEffect
内で復元する。
@Composable fun ListScreen(){ val listState = rememberLazyListState() // スクロール位置を復元 LaunchedEffect(true) { listState.scrollToItem( listState.firstVisibleItemIndex, listState.firstVisibleItemScrollOffset ) } LazyColumn(state = listState) {} }
setViewCompositionStrategyだけではデータは保持されるが復元されなかったので自分で記述が必要だった。 上記とは異なるスクロール方式、あるいは他の状態の復元であっても基本的にやることは同じかと。