Skip to content

Commit 7984781

Browse files
committed
Move LazyListState to ViewModels for list screens
Refactored Modules, Repositories, Repository, and SuperUser screens to use a LazyListState instance managed by their respective ViewModels instead of local state. This centralizes scroll state management, improves state persistence, and simplifies screen composables.
1 parent da59779 commit 7984781

9 files changed

Lines changed: 20 additions & 21 deletions

File tree

app/src/main/kotlin/com/dergoogler/mmrl/ui/screens/modules/ModulesScreen.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import androidx.compose.foundation.interaction.MutableInteractionSource
1111
import androidx.compose.foundation.interaction.PressInteraction
1212
import androidx.compose.foundation.layout.WindowInsets
1313
import androidx.compose.foundation.layout.padding
14-
import androidx.compose.foundation.lazy.rememberLazyListState
1514
import androidx.compose.material3.FloatingActionButton
1615
import androidx.compose.material3.Icon
1716
import androidx.compose.material3.IconButton
@@ -72,11 +71,10 @@ fun ModulesScreen(
7271
val isLoading by viewModel.isLoading.collectAsStateWithLifecycle()
7372

7473
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
75-
val listState = rememberLazyListState()
7674

7775
val pullToRefreshState = rememberPullToRefreshState()
7876

79-
val isScrollingUp by listState.isScrollingUp()
77+
val isScrollingUp by viewModel.listState.isScrollingUp()
8078
val showFab by remember {
8179
derivedStateOf {
8280
isScrollingUp && !viewModel.isSearch && viewModel.isProviderAlive
@@ -159,7 +157,7 @@ fun ModulesScreen(
159157
this@Scaffold.ModulesList(
160158
innerPadding = innerPadding,
161159
list = list,
162-
state = listState,
160+
state = viewModel.listState,
163161
viewModel = viewModel,
164162
onDownload = download,
165163
isProviderAlive = viewModel.isProviderAlive,

app/src/main/kotlin/com/dergoogler/mmrl/ui/screens/repositories/RepositoriesScreen.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import androidx.compose.animation.scaleOut
77
import androidx.compose.foundation.layout.WindowInsets
88
import androidx.compose.foundation.layout.fillMaxWidth
99
import androidx.compose.foundation.layout.padding
10-
import androidx.compose.foundation.lazy.rememberLazyListState
1110
import androidx.compose.foundation.shape.RoundedCornerShape
1211
import androidx.compose.foundation.text.KeyboardActions
1312
import androidx.compose.foundation.text.KeyboardOptions
@@ -87,8 +86,7 @@ fun RepositoriesScreen() = LocalScreenProvider {
8786

8887
val pullToRefreshState = rememberPullToRefreshState()
8988

90-
val listSate = rememberLazyListState()
91-
val showFab by listSate.isScrollingUp()
89+
val showFab by viewModel.listState.isScrollingUp()
9290

9391
var repoUrl by remember { mutableStateOf("") }
9492
var message: String by remember { mutableStateOf("") }
@@ -207,7 +205,7 @@ fun RepositoriesScreen() = LocalScreenProvider {
207205
this@Scaffold.RepositoriesList(
208206
innerPadding = innerPadding,
209207
list = list,
210-
state = listSate,
208+
state = viewModel.listState,
211209
delete = viewModel::delete,
212210
getUpdate = viewModel::getUpdate
213211
)

app/src/main/kotlin/com/dergoogler/mmrl/ui/screens/repository/RepositoryScreen.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import androidx.compose.foundation.layout.offset
1616
import androidx.compose.foundation.layout.padding
1717
import androidx.compose.foundation.lazy.LazyColumn
1818
import androidx.compose.foundation.lazy.items
19-
import androidx.compose.foundation.lazy.rememberLazyListState
2019
import androidx.compose.foundation.shape.RoundedCornerShape
2120
import androidx.compose.material3.Icon
2221
import androidx.compose.material3.IconButton
@@ -93,7 +92,6 @@ fun RepositoryScreen(repo: Repo) = LocalScreenProvider {
9392
val hazeState = LocalHazeState.current
9493

9594
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
96-
val listState = rememberLazyListState()
9795

9896
BackHandler(
9997
enabled = viewModel.isSearch,
@@ -151,7 +149,7 @@ fun RepositoryScreen(repo: Repo) = LocalScreenProvider {
151149
}
152150

153151
LazyColumn(
154-
state = listState,
152+
state = viewModel.listState,
155153
modifier = Modifier
156154
.fillMaxSize()
157155
.hazeSource(state = hazeState),

app/src/main/kotlin/com/dergoogler/mmrl/ui/screens/superuser/SuperUserScreen.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package com.dergoogler.mmrl.ui.screens.superuser
33
import androidx.activity.compose.BackHandler
44
import androidx.compose.foundation.layout.WindowInsets
55
import androidx.compose.foundation.layout.padding
6-
import androidx.compose.foundation.lazy.rememberLazyListState
76
import androidx.compose.material3.Icon
87
import androidx.compose.material3.IconButton
98
import androidx.compose.material3.TopAppBarDefaults
@@ -49,7 +48,6 @@ fun SuperUserScreen() = LocalScreenProvider {
4948
val isLoading by viewModel.isLoading.collectAsStateWithLifecycle()
5049

5150
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior()
52-
val listState = rememberLazyListState()
5351

5452
val pullToRefreshState = rememberPullToRefreshState()
5553

@@ -103,7 +101,7 @@ fun SuperUserScreen() = LocalScreenProvider {
103101
this@Scaffold.SuperUserList(
104102
innerPadding = innerPadding,
105103
list = list,
106-
state = listState,
104+
state = viewModel.listState,
107105
)
108106
}
109107
}

app/src/main/kotlin/com/dergoogler/mmrl/viewmodel/ModulesViewModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.dergoogler.mmrl.viewmodel
33
import android.app.Application
44
import android.content.Context
55
import android.widget.Toast
6+
import androidx.compose.foundation.lazy.LazyListState
67
import androidx.compose.runtime.Composable
78
import androidx.compose.runtime.LaunchedEffect
89
import androidx.compose.runtime.derivedStateOf
@@ -26,12 +27,12 @@ import com.dergoogler.mmrl.platform.PlatformManager
2627
import com.dergoogler.mmrl.platform.content.LocalModule.Companion.hasAction
2728
import com.dergoogler.mmrl.platform.content.LocalModule.Companion.hasWebUI
2829
import com.dergoogler.mmrl.platform.content.ModuleCompatibility
30+
import com.dergoogler.mmrl.platform.model.ModId
2931
import com.dergoogler.mmrl.platform.stub.IModuleOpsCallback
3032
import com.dergoogler.mmrl.repository.LocalRepository
3133
import com.dergoogler.mmrl.repository.ModulesRepository
3234
import com.dergoogler.mmrl.service.DownloadService
3335
import com.dergoogler.mmrl.utils.Utils
34-
import com.dergoogler.mmrl.platform.model.ModId
3536
import dagger.hilt.android.lifecycle.HiltViewModel
3637
import kotlinx.coroutines.flow.MutableStateFlow
3738
import kotlinx.coroutines.flow.SharingStarted
@@ -90,6 +91,8 @@ class ModulesViewModel @Inject constructor(
9091
private val keyFlow = MutableStateFlow("")
9192
val query get() = keyFlow.asStateFlow()
9293

94+
val listState: LazyListState = LazyListState()
95+
9396
private val cacheFlow = MutableStateFlow(listOf<LocalModule>())
9497
private val localFlow = MutableStateFlow(listOf<LocalModule>())
9598
val local get() = localFlow.asStateFlow()

app/src/main/kotlin/com/dergoogler/mmrl/viewmodel/RepositoriesViewModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.dergoogler.mmrl.viewmodel
22

33
import android.app.Application
4+
import androidx.compose.foundation.lazy.LazyListState
45
import androidx.compose.runtime.getValue
56
import androidx.compose.runtime.mutableStateOf
67
import androidx.compose.runtime.setValue
@@ -46,6 +47,8 @@ class RepositoriesViewModel @Inject constructor(
4647
private val reposFlow = MutableStateFlow(listOf<RepoState>())
4748
val repos get() = reposFlow.asStateFlow()
4849

50+
val listState: LazyListState = LazyListState()
51+
4952
private val repositoriesMenu
5053
get() = userPreferencesRepository.data
5154
.map { it.repositoriesMenu }

app/src/main/kotlin/com/dergoogler/mmrl/viewmodel/RepositoryViewModel.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package com.dergoogler.mmrl.viewmodel
22

33
import android.app.Application
4-
import android.os.Bundle
4+
import androidx.compose.foundation.lazy.LazyListState
55
import androidx.compose.runtime.Composable
66
import androidx.compose.runtime.getValue
77
import androidx.compose.runtime.mutableStateOf
88
import androidx.compose.runtime.setValue
99
import androidx.hilt.navigation.compose.hiltViewModel
1010
import androidx.lifecycle.viewModelScope
1111
import com.dergoogler.mmrl.database.entity.Repo
12-
import com.dergoogler.mmrl.database.entity.Repo.Companion.toRepo
1312
import com.dergoogler.mmrl.datastore.UserPreferencesRepository
1413
import com.dergoogler.mmrl.datastore.model.Option
1514
import com.dergoogler.mmrl.datastore.model.RepositoryMenu
@@ -18,9 +17,6 @@ import com.dergoogler.mmrl.model.state.OnlineState
1817
import com.dergoogler.mmrl.model.state.OnlineState.Companion.createState
1918
import com.dergoogler.mmrl.repository.LocalRepository
2019
import com.dergoogler.mmrl.repository.ModulesRepository
21-
import com.dergoogler.mmrl.ext.panicString
22-
import com.dergoogler.mmrl.model.json.UpdateJson
23-
import com.dergoogler.mmrl.model.state.RepoState
2420
import dagger.assisted.Assisted
2521
import dagger.assisted.AssistedFactory
2622
import dagger.assisted.AssistedInject
@@ -50,6 +46,8 @@ class RepositoryViewModel @AssistedInject constructor(
5046
private val keyFlow = MutableStateFlow("")
5147
val query get() = keyFlow.asStateFlow()
5248

49+
val listState: LazyListState = LazyListState()
50+
5351
private val cacheFlow = MutableStateFlow(listOf<Pair<OnlineState, OnlineModule>>())
5452
private val onlineFlow = MutableStateFlow(listOf<Pair<OnlineState, OnlineModule>>())
5553
val online get() = onlineFlow.asStateFlow()

app/src/main/kotlin/com/dergoogler/mmrl/viewmodel/SuperUserViewModel.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import android.content.pm.PackageInfo
77
import android.graphics.Bitmap
88
import android.graphics.drawable.Drawable
99
import android.os.Parcelable
10+
import androidx.compose.foundation.lazy.LazyListState
1011
import androidx.compose.runtime.getValue
1112
import androidx.compose.runtime.mutableStateMapOf
1213
import androidx.compose.runtime.mutableStateOf
@@ -58,6 +59,8 @@ class SuperUserViewModel @Inject constructor(
5859
private val keyFlow = MutableStateFlow("")
5960
val query get() = keyFlow.asStateFlow()
6061

62+
val listState: LazyListState = LazyListState()
63+
6164
private val cacheFlow = MutableStateFlow(listOf<AppInfo>())
6265
private val localFlow = MutableStateFlow(listOf<AppInfo>())
6366
val local get() = localFlow.asStateFlow()

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
1+
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 --add-opens=java.base/java.io=ALL-UNNAMED
22
org.gradle.caching=true
33
org.gradle.configuration-cache=true
44
android.enableJetifier=true

0 commit comments

Comments
 (0)