I have top tab view. Each tab returns same composable that shows list of different posts. Initially i fetch tabs and data initial data for each tab. It looks like this:
@Composable
fun Feed() {
val tabsViewModel: TabsViewModel = hiltViewModel()
val tabs = tabsViewModel.state.collectAsState()
val communityFieldViewModel: CommunityFeedViewModel = hiltViewModel()
val selectedTab = tabsViewModel.selectedTab.collectAsState()
val indexOfTile = tabs.value.indexOfFirst { it.id == selectedTab.value }
if(tabs.value.isNotEmpty()) {
var tabIndex by remember { mutableStateOf(indexOfTile) }
Column {
TabRow(selectedTabIndex = tabIndex) {
tabs.value.forEachIndexed { index, tab ->
communityFieldViewModel.loadInitialState(tab.id, tab.tiles, "succeed", tab.token)
Tab(selected = tabIndex == index,
onClick = { tabIndex = index },
text = { Text(text = tab.title) })
}
}
tabs.value.forEachIndexed { _, tab ->
CommunityFeed(tab.id)
}
}
}
}
My CommunityFeed is getting data from CommunityFeedViewModel and I set initial data for CommunityFeedViewModel in Feed. But problem is that I do not know how to get different data in CommunityFeed and now both render for example all posts and should be different. Here is CommunityFeed and CommunityFeedModel. Any advice?
data class CommunityState(
val path: String = "",
val tiles: List<Tile> = emptyList(),
val loadingState: String = "idle",
val token: String? = null
)
@HiltViewModel
class CommunityFeedViewModel @Inject constructor(
private val tileRepository: TileRepository,
): ViewModel() {
private val state = MutableStateFlow(CommunityState())
val modelState = state.asStateFlow()
fun loadInitialState(path: String, tiles: List<Tile>?, loadingState: String, token: String?) {
val tileList = tiles ?: emptyList()
state.value = CommunityState(path, tileList, loadingState, token)
}
}
@Composable
fun CommunityFeed(path: String) {
val feedViewModel: CommunityFeedViewModel = hiltViewModel()
val state = feedViewModel.modelState.collectAsState()
if(state.value.path == path) {
TileListView(tiles = state.value.tiles, loadMore = {})
}
}