RicardoJiang / wanandroid-compose

Compose+MVI+Navigation实现wanAndroid客户端
443 stars 76 forks source link

大佬讲的LazyColumn保存状态的用法,使用过程中不起作用 #3

Closed wjbd closed 2 years ago

wjbd commented 2 years ago
val listState = if(listData.itemCount>0) state else LazyListState()

状态保存不起作用,不知道是不是viewmodel每次都会生成新的原因(打印了viewModel内存地址,每次都不一样),目前我使用的是viewModel()来生成

RicardoJiang commented 2 years ago

Returns an existing ViewModel or creates a new one in the given owner (usually, a fragment or an activity), defaulting to the owner provided by LocalViewModelStoreOwner.

通过viewmodel()来获取,按道理如果已经创建过,会返回一个已经存在的ViewModel,生命周期跟Activity一致,应该不会重新创建啊

wjbd commented 2 years ago

按照官网文档,确实是这么写的,但是我也不清楚为什么会发生内存地址都不一样的情况,因为我在跑别人的demo的时候,发现viewmodel的内存地址都没有变化

wjbd commented 2 years ago

仔细排查后发现,我每次使用 navController.navigate进行页面导航的时候,他总是会重新生成一次,但是大佬项目里面就不会重新生成。按返回键的时候发现,页面确实还在那里,但是按照BottomeNavigationBar的样子,应该把页面从栈里给顶上来,不清楚是怎么回事

DengAnbang commented 1 year ago

仔细排查后发现,我每次使用 navController.navigate进行页面导航的时候,他总是会重新生成一次,但是大佬项目里面就不会重新生成。按返回键的时候发现,页面确实还在那里,但是按照BottomeNavigationBar的样子,应该把页面从栈里给顶上来,不清楚是怎么回事

Compose中的navigation导航修改了viewModelStoreOwner,使viewmodel 的生命周期和compose的生命周期绑定的,所以每次重新创建compose的时候viewmodel都是新的,如果要共享viewmodel,需要使用和activity绑定的viewmodel,具体的看NavHost这个类的源码