Răsfoiți Sursa

replaced flow with suspend function to fix performance issue

sirekanian 3 ani în urmă
părinte
comite
1517b49c32

+ 11 - 7
app/src/main/java/com/sirekanian/spacetime/MainPresenter.kt

@@ -7,12 +7,8 @@ import androidx.compose.ui.platform.LocalContext
 import com.sirekanian.spacetime.data.Repository
 import com.sirekanian.spacetime.data.api.ThumbnailApi
 import com.sirekanian.spacetime.ext.app
-import com.sirekanian.spacetime.model.GalleryPage
 import com.sirekanian.spacetime.model.ImagePage
-import com.sirekanian.spacetime.model.Page
 import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.launch
 
 @Composable
@@ -25,7 +21,6 @@ fun rememberMainPresenter(): MainPresenter {
 interface MainPresenter {
 
     val state: MainState
-    fun observePages(): Flow<List<Page>>
     fun savePage(page: ImagePage)
     fun removePage(page: ImagePage)
     fun loadGallery()
@@ -40,18 +35,23 @@ class MainPresenterImpl(
 
     override val state = MainState()
 
-    override fun observePages(): Flow<List<Page>> =
-        repository.observePages().map { it.plus(GalleryPage) }
+    init {
+        scope.launch {
+            updatePages()
+        }
+    }
 
     override fun savePage(page: ImagePage) {
         scope.launch {
             repository.savePage(page)
+            updatePages()
         }
     }
 
     override fun removePage(page: ImagePage) {
         scope.launch {
             repository.removePage(page)
+            updatePages()
         }
     }
 
@@ -61,4 +61,8 @@ class MainPresenterImpl(
         }
     }
 
+    private suspend fun updatePages() {
+        state.pages = repository.getPages()
+    }
+
 }

+ 1 - 3
app/src/main/java/com/sirekanian/spacetime/MainScreen.kt

@@ -4,8 +4,6 @@ import androidx.compose.foundation.layout.WindowInsets
 import androidx.compose.foundation.layout.asPaddingValues
 import androidx.compose.foundation.layout.systemBars
 import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
-import androidx.compose.runtime.getValue
 import com.google.accompanist.pager.ExperimentalPagerApi
 import com.google.accompanist.pager.HorizontalPager
 import com.sirekanian.spacetime.model.Draft
@@ -19,7 +17,7 @@ import com.sirekanian.spacetime.ui.ImagePageContent
 @ExperimentalPagerApi
 fun MainScreen(presenter: MainPresenter) {
     val state = presenter.state
-    val pages by presenter.observePages().collectAsState(listOf())
+    val pages = state.pages.plus(GalleryPage)
     val insets = WindowInsets.systemBars.asPaddingValues()
     HorizontalPager(
         count = pages.size,

+ 2 - 0
app/src/main/java/com/sirekanian/spacetime/MainState.kt

@@ -8,11 +8,13 @@ import com.sirekanian.spacetime.ext.currentDate
 import com.sirekanian.spacetime.ext.minusMonths
 import com.sirekanian.spacetime.ext.withDayOfMonth
 import com.sirekanian.spacetime.model.Draft
+import com.sirekanian.spacetime.model.ImagePage
 import com.sirekanian.spacetime.model.Thumbnail
 import kotlinx.datetime.LocalDate
 
 class MainState {
 
+    var pages by mutableStateOf(listOf<ImagePage>())
     var draft by mutableStateOf<Draft?>(null)
     var thumbnails by mutableStateOf(listOf<Thumbnail>())
     val nextDate: LocalDate by derivedStateOf {

+ 3 - 5
app/src/main/java/com/sirekanian/spacetime/data/Repository.kt

@@ -3,12 +3,10 @@ package com.sirekanian.spacetime.data
 import com.sirekanian.spacetime.data.local.PageDao
 import com.sirekanian.spacetime.data.local.PageEntity
 import com.sirekanian.spacetime.model.ImagePage
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.map
 
 interface Repository {
 
-    fun observePages(): Flow<List<ImagePage>>
+    suspend fun getPages(): List<ImagePage>
     suspend fun savePage(page: ImagePage)
     suspend fun removePage(page: ImagePage)
 
@@ -16,8 +14,8 @@ interface Repository {
 
 class RepositoryImpl(private val dao: PageDao) : Repository {
 
-    override fun observePages(): Flow<List<ImagePage>> =
-        dao.observe().map { it.map(PageEntity::toModel) }
+    override suspend fun getPages(): List<ImagePage> =
+        dao.select().map(PageEntity::toModel)
 
     override suspend fun savePage(page: ImagePage) {
         dao.insert(page.toEntity())

+ 1 - 2
app/src/main/java/com/sirekanian/spacetime/data/local/PageDao.kt

@@ -1,13 +1,12 @@
 package com.sirekanian.spacetime.data.local
 
 import androidx.room.*
-import kotlinx.coroutines.flow.Flow
 
 @Dao
 interface PageDao {
 
     @Query("SELECT * FROM PageEntity")
-    fun observe(): Flow<List<PageEntity>>
+    suspend fun select(): List<PageEntity>
 
     @Insert(onConflict = OnConflictStrategy.REPLACE)
     suspend fun insert(page: PageEntity)