From 2ce7e40f3389167a990cb0b1533fcd63fc62f95b Mon Sep 17 00:00:00 2001 From: takahirom Date: Fri, 5 Nov 2021 10:25:14 +0900 Subject: [PATCH 1/4] Introduce FeedScreenState to separate UI related logic, state and UI --- .../feeder/core/UnidirectionalViewModel.kt | 12 +++ .../droidkaigi/feeder/feed/FeedScreen.kt | 92 +++++++------------ .../droidkaigi/feeder/feed/FeedScreenState.kt | 85 +++++++++++++++++ uicomponent-compose/main/build.gradle | 2 + .../io/github/droidkaigi/feeder/AppContent.kt | 8 +- 5 files changed, 137 insertions(+), 62 deletions(-) create mode 100644 uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt diff --git a/uicomponent-compose/core/src/main/java/io/github/droidkaigi/feeder/core/UnidirectionalViewModel.kt b/uicomponent-compose/core/src/main/java/io/github/droidkaigi/feeder/core/UnidirectionalViewModel.kt index 07202c882..1016ea60f 100644 --- a/uicomponent-compose/core/src/main/java/io/github/droidkaigi/feeder/core/UnidirectionalViewModel.kt +++ b/uicomponent-compose/core/src/main/java/io/github/droidkaigi/feeder/core/UnidirectionalViewModel.kt @@ -28,6 +28,18 @@ inline fun use( ) } +@Composable +inline fun UnidirectionalViewModel<*, *, STATE>.state(): STATE { + val state by state.collectAsState() + return state +} + +inline fun UnidirectionalViewModel.dispatcher(): (EVENT) -> Unit { + return { event -> + event(event) + } +} + interface UnidirectionalViewModel { val state: StateFlow val effect: Flow diff --git a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt index 0d7aa5dda..54419c2fd 100644 --- a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt +++ b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt @@ -11,10 +11,8 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyListState import androidx.compose.foundation.lazy.itemsIndexed -import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.BackdropScaffold import androidx.compose.material.BackdropScaffoldState -import androidx.compose.material.BackdropValue import androidx.compose.material.Divider import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon @@ -22,13 +20,11 @@ import androidx.compose.material.IconButton import androidx.compose.material.MaterialTheme import androidx.compose.material.ScrollableTabRow import androidx.compose.material.SnackbarHost -import androidx.compose.material.SnackbarResult import androidx.compose.material.Surface import androidx.compose.material.Tab import androidx.compose.material.Text import androidx.compose.material.TopAppBar import androidx.compose.material.primarySurface -import androidx.compose.material.rememberBackdropScaffoldState import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.MutableState @@ -40,7 +36,6 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.semantics.semantics @@ -62,15 +57,13 @@ import io.github.droidkaigi.feeder.FeedContents import io.github.droidkaigi.feeder.FeedItem import io.github.droidkaigi.feeder.Filters import io.github.droidkaigi.feeder.Theme -import io.github.droidkaigi.feeder.core.R as CoreR import io.github.droidkaigi.feeder.core.TabIndicator -import io.github.droidkaigi.feeder.core.getReadableMessage import io.github.droidkaigi.feeder.core.theme.AppThemeWithBackground import io.github.droidkaigi.feeder.core.theme.greenDroid -import io.github.droidkaigi.feeder.core.use import io.github.droidkaigi.feeder.core.util.collectInLaunchedEffect -import kotlin.reflect.KClass import kotlinx.coroutines.launch +import kotlin.reflect.KClass +import io.github.droidkaigi.feeder.core.R as CoreR sealed class FeedTab(val name: String, val routePath: String) { object Home : FeedTab("Home", "home") @@ -97,76 +90,43 @@ sealed class FeedTab(val name: String, val routePath: String) { @OptIn(ExperimentalPagerApi::class, ExperimentalMaterialApi::class) @Composable fun FeedScreen( - selectedTab: FeedTab, + pagerState: PagerState, onSelectedTab: (FeedTab) -> Unit, onNavigationIconClick: () -> Unit, onDroidKaigi2021ArticleClick: () -> Unit, isDroidKaigiEnd: MutableState, onDetailClick: (FeedItem) -> Unit, ) { - val scaffoldState = rememberBackdropScaffoldState(BackdropValue.Concealed) - val pagerState = rememberPagerState( - initialPage = FeedTab.values().indexOf(selectedTab) - ) - - val ( - state, - effectFlow, - dispatch, - ) = use(feedViewModel()) - - val ( - fmPlayerState, - fmPlayerEffectFlow, - fmPlayerDispatch, - ) = use(fmPlayerViewModel()) - - val context = LocalContext.current + val feedScreenState: FeedScreenState = rememberFeedScreenState() - effectFlow.collectInLaunchedEffect { effect -> + feedScreenState.effect.collectInLaunchedEffect { effect -> when (effect) { is FeedViewModel.Effect.ErrorMessage -> { - when ( - scaffoldState.snackbarHostState.showSnackbar( - message = effect.appError.getReadableMessage(context), - actionLabel = "Reload", - ) - ) { - SnackbarResult.ActionPerformed -> { - dispatch(FeedViewModel.Event.ReloadContent) - } - SnackbarResult.Dismissed -> { - } - } + feedScreenState.onErrorMessage(effect) + } } } - val tabLazyListStates = FeedTab.values() - .map { it to rememberLazyListState() } - .toMap() + val uiState = feedScreenState.uiState FeedScreen( - scaffoldState = scaffoldState, + scaffoldState = feedScreenState.scaffoldState, pagerState = pagerState, - tabLazyListStates = tabLazyListStates, - feedContents = state.filteredFeedContents, - fmPlayerState = fmPlayerState, - filters = state.filters, + tabLazyListStates = feedScreenState.tabLazyListStates, + feedContents = uiState.filteredFeedContents, + fmPlayerState = feedScreenState.fmPlayerUiState, + filters = uiState.filters, onSelectTab = onSelectedTab, onNavigationIconClick = onNavigationIconClick, onFavoriteChange = { - dispatch(FeedViewModel.Event.ToggleFavorite(feedItem = it)) + feedScreenState.onFavoriteChange(it) }, onFavoriteFilterChanged = { - dispatch( - FeedViewModel.Event.ChangeFavoriteFilter( - filters = state.filters.copy(filterFavorite = it) - ) - ) + feedScreenState.onFavoriteFilterChange(uiState.filters, it) }, onClickFeed = onDetailClick, onClickPlayPodcastButton = { - fmPlayerDispatch(FmPlayerViewModel.Event.ChangePlayerState(it.podcastLink)) + feedScreenState.onPotcastPlayButtonClick(it) }, onClickDroidKaigi2021Article = onDroidKaigi2021ArticleClick, isDroidKaigiEnd = isDroidKaigiEnd @@ -477,7 +437,9 @@ fun PreviewFeedScreen() { provideFmPlayerViewModelFactory { fakeFmPlayerViewModel() } ) { FeedScreen( - selectedTab = FeedTab.Home, + pagerState = rememberPagerState( + initialPage = FeedTab.values().indexOf(FeedTab.Home) + ), onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, @@ -499,7 +461,9 @@ fun PreviewDarkFeedScreen() { provideFmPlayerViewModelFactory { fakeFmPlayerViewModel() } ) { FeedScreen( - selectedTab = FeedTab.Home, + pagerState = rememberPagerState( + initialPage = FeedTab.values().indexOf(FeedTab.Home) + ), onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, @@ -519,7 +483,9 @@ fun PreviewFeedScreenWhenDroidKaigiEnd() { provideFmPlayerViewModelFactory { fakeFmPlayerViewModel() } ) { FeedScreen( - selectedTab = FeedTab.Home, + pagerState = rememberPagerState( + initialPage = FeedTab.values().indexOf(FeedTab.Home) + ), onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, @@ -541,7 +507,9 @@ fun PreviewDarkFeedScreenWhenDroidKaigiEnd() { provideFmPlayerViewModelFactory { fakeFmPlayerViewModel() } ) { FeedScreen( - selectedTab = FeedTab.Home, + pagerState = rememberPagerState( + initialPage = FeedTab.values().indexOf(FeedTab.Home) + ), onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, @@ -561,7 +529,9 @@ fun PreviewFeedScreenWithStartBlog() { provideFmPlayerViewModelFactory { fakeFmPlayerViewModel() } ) { FeedScreen( - selectedTab = FeedTab.FilteredFeed.Blog, + pagerState = rememberPagerState( + initialPage = FeedTab.values().indexOf(FeedTab.FilteredFeed.Blog) + ), onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, diff --git a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt new file mode 100644 index 000000000..63829d9ee --- /dev/null +++ b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt @@ -0,0 +1,85 @@ +package io.github.droidkaigi.feeder.feed + +import android.content.Context +import androidx.compose.foundation.lazy.rememberLazyListState +import androidx.compose.material.BackdropScaffoldState +import androidx.compose.material.BackdropValue +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.SnackbarResult +import androidx.compose.material.rememberBackdropScaffoldState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.platform.LocalContext +import io.github.droidkaigi.feeder.FeedItem +import io.github.droidkaigi.feeder.Filters +import io.github.droidkaigi.feeder.core.dispatcher +import io.github.droidkaigi.feeder.core.getReadableMessage +import io.github.droidkaigi.feeder.core.state +import kotlinx.coroutines.flow.Flow + +@OptIn(ExperimentalMaterialApi::class) +class FeedScreenState( + private val feedViewModel: FeedViewModel, + private val fmPlayerViewModel: FmPlayerViewModel, + val scaffoldState: BackdropScaffoldState, + val context: Context, +) { + val uiState: FeedViewModel.State @Composable get() = feedViewModel.state() + private val dispatcher: (FeedViewModel.Event) -> Unit get() = feedViewModel.dispatcher() + val effect: Flow get() = feedViewModel.effect + + val fmPlayerUiState: FmPlayerViewModel.State @Composable get() = fmPlayerViewModel.state() + private val fmPlayerDispatcher: (FmPlayerViewModel.Event) -> Unit + get() = fmPlayerViewModel.dispatcher() + + val tabLazyListStates + @Composable get() = FeedTab.values() + .map { it to rememberLazyListState() } + .toMap() + + + suspend fun onErrorMessage(effect: FeedViewModel.Effect.ErrorMessage) { + when ( + scaffoldState.snackbarHostState.showSnackbar( + message = effect.appError.getReadableMessage(context), + actionLabel = "Reload", + ) + ) { + SnackbarResult.ActionPerformed -> { + dispatcher(FeedViewModel.Event.ReloadContent) + } + SnackbarResult.Dismissed -> { + } + } + } + + fun onFavoriteChange(feedItem: FeedItem) { + dispatcher(FeedViewModel.Event.ToggleFavorite(feedItem = feedItem)) + } + + fun onFavoriteFilterChange(currentFilters: Filters, isFavoriteFiltered: Boolean) { + dispatcher( + FeedViewModel.Event.ChangeFavoriteFilter( + filters = currentFilters.copy(filterFavorite = isFavoriteFiltered) + + ) + ) + } + + fun onPotcastPlayButtonClick(podcast: FeedItem.Podcast) { + fmPlayerDispatcher(FmPlayerViewModel.Event.ChangePlayerState(podcast.podcastLink)) + } +} + +@OptIn(ExperimentalMaterialApi::class) +@Composable +fun rememberFeedScreenState( + feedViewModel: FeedViewModel = feedViewModel(), + fmPlayerViewModel: FmPlayerViewModel = fmPlayerViewModel(), + scaffoldState: BackdropScaffoldState = rememberBackdropScaffoldState(BackdropValue.Concealed), + context: Context = LocalContext.current, +): FeedScreenState { + return remember { + FeedScreenState(feedViewModel, fmPlayerViewModel, scaffoldState, context) + } +} diff --git a/uicomponent-compose/main/build.gradle b/uicomponent-compose/main/build.gradle index e40aa530d..c8bd1c2d5 100644 --- a/uicomponent-compose/main/build.gradle +++ b/uicomponent-compose/main/build.gradle @@ -50,6 +50,8 @@ dependencies { implementation Dep.Accompanist.insets implementation Dep.Accompanist.systemuicontroller + implementation Dep.Accompanist.pager + implementation (Dep.Coroutines.core) { version { strictly Versions.coroutines diff --git a/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt b/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt index e00a81c71..7bab64379 100644 --- a/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt +++ b/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt @@ -22,6 +22,8 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.navArgument import androidx.navigation.navDeepLink +import com.google.accompanist.pager.ExperimentalPagerApi +import com.google.accompanist.pager.rememberPagerState import com.google.accompanist.systemuicontroller.rememberSystemUiController import io.github.droidkaigi.feeder.core.R as CoreR import io.github.droidkaigi.feeder.core.navigation.chromeCustomTabs @@ -44,6 +46,7 @@ private const val TIMETABLE_DETAIL_PATH = "timetable/detail/" private val drawerOpenedStatusBarColor = Color.Black.copy(alpha = 0.48f) +@OptIn(ExperimentalPagerApi::class) @Composable fun AppContent( modifier: Modifier = Modifier, @@ -104,9 +107,12 @@ fun AppContent( ) val selectedTab = FeedTab.ofRoutePath(routePath.value) drawerContentState.onSelectDrawerContent(selectedTab) + val pagerState = rememberPagerState( + initialPage = FeedTab.values().indexOf(selectedTab) + ) FeedScreen( onNavigationIconClick = onNavigationIconClick, - selectedTab = selectedTab, + pagerState = pagerState, onSelectedTab = { feedTab -> // We don't use navigation component transitions here for animation. routePath.value = feedTab.routePath From 14257d5b9f2a017582e6bd109c74e4eab930399c Mon Sep 17 00:00:00 2001 From: takahirom Date: Sun, 7 Nov 2021 16:47:04 +0900 Subject: [PATCH 2/4] Fix format --- .../main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt | 5 ++--- .../java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt | 1 - 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt index 54419c2fd..d713377f3 100644 --- a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt +++ b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt @@ -57,13 +57,13 @@ import io.github.droidkaigi.feeder.FeedContents import io.github.droidkaigi.feeder.FeedItem import io.github.droidkaigi.feeder.Filters import io.github.droidkaigi.feeder.Theme +import io.github.droidkaigi.feeder.core.R as CoreR import io.github.droidkaigi.feeder.core.TabIndicator import io.github.droidkaigi.feeder.core.theme.AppThemeWithBackground import io.github.droidkaigi.feeder.core.theme.greenDroid import io.github.droidkaigi.feeder.core.util.collectInLaunchedEffect -import kotlinx.coroutines.launch import kotlin.reflect.KClass -import io.github.droidkaigi.feeder.core.R as CoreR +import kotlinx.coroutines.launch sealed class FeedTab(val name: String, val routePath: String) { object Home : FeedTab("Home", "home") @@ -103,7 +103,6 @@ fun FeedScreen( when (effect) { is FeedViewModel.Effect.ErrorMessage -> { feedScreenState.onErrorMessage(effect) - } } } diff --git a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt index 63829d9ee..eb74dba12 100644 --- a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt +++ b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt @@ -37,7 +37,6 @@ class FeedScreenState( .map { it to rememberLazyListState() } .toMap() - suspend fun onErrorMessage(effect: FeedViewModel.Effect.ErrorMessage) { when ( scaffoldState.snackbarHostState.showSnackbar( From 7c258a11f3582c3c6a34541ebdc9dbb34bafa031 Mon Sep 17 00:00:00 2001 From: takahirom Date: Sun, 7 Nov 2021 16:54:27 +0900 Subject: [PATCH 3/4] Use feedScreenState as arg and refactor around isDroidKaigiEnd --- .../droidkaigi/feeder/feed/FeedScreen.kt | 24 +++++++++---------- .../droidkaigi/feeder/feed/FeedScreenState.kt | 6 ++--- .../io/github/droidkaigi/feeder/AppContent.kt | 2 +- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt index d713377f3..6c47c1e03 100644 --- a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt +++ b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt @@ -27,10 +27,8 @@ import androidx.compose.material.TopAppBar import androidx.compose.material.primarySurface import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.MutableState import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier @@ -90,14 +88,14 @@ sealed class FeedTab(val name: String, val routePath: String) { @OptIn(ExperimentalPagerApi::class, ExperimentalMaterialApi::class) @Composable fun FeedScreen( + feedScreenState: FeedScreenState = rememberFeedScreenState(), pagerState: PagerState, onSelectedTab: (FeedTab) -> Unit, onNavigationIconClick: () -> Unit, onDroidKaigi2021ArticleClick: () -> Unit, - isDroidKaigiEnd: MutableState, + isDroidKaigiEnd: Boolean, onDetailClick: (FeedItem) -> Unit, ) { - val feedScreenState: FeedScreenState = rememberFeedScreenState() feedScreenState.effect.collectInLaunchedEffect { effect -> when (effect) { @@ -151,7 +149,7 @@ private fun FeedScreen( onClickFeed: (FeedItem) -> Unit, onClickPlayPodcastButton: (FeedItem.Podcast) -> Unit, onClickDroidKaigi2021Article: () -> Unit, - isDroidKaigiEnd: MutableState, + isDroidKaigiEnd: Boolean, ) { val density = LocalDensity.current BackdropScaffold( @@ -262,7 +260,7 @@ private fun FeedList( onClickArticleItem: () -> Unit, listState: LazyListState, isFilterState: Boolean, - isDroidKaigiEnd: MutableState, + isDroidKaigiEnd: Boolean, ) { val isHome = feedTab is FeedTab.Home Surface( @@ -291,14 +289,14 @@ private fun FeedList( if (isHome && index == 0) { if (isFilterState) { FilterItemCountRow(feedContents.size.toString()) - } else if (!isDroidKaigiEnd.value) { + } else if (!isDroidKaigiEnd) { DroidKaigi2021ArticleItem( onClick = onClickArticleItem, shouldPadding = isFilterState, ) } } - if (isDroidKaigiEnd.value && isHome && index == 0) { + if (isDroidKaigiEnd && isHome && index == 0) { FirstFeedItem( feedItem = feedItem, favorited = favorited, @@ -442,7 +440,7 @@ fun PreviewFeedScreen() { onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, - isDroidKaigiEnd = remember { mutableStateOf(false) }, + isDroidKaigiEnd = false, ) { feedItem: FeedItem -> } } @@ -466,7 +464,7 @@ fun PreviewDarkFeedScreen() { onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, - isDroidKaigiEnd = remember { mutableStateOf(false) }, + isDroidKaigiEnd = false, ) { feedItem: FeedItem -> } } @@ -488,7 +486,7 @@ fun PreviewFeedScreenWhenDroidKaigiEnd() { onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, - isDroidKaigiEnd = remember { mutableStateOf(true) }, + isDroidKaigiEnd = true, ) { feedItem: FeedItem -> } } @@ -512,7 +510,7 @@ fun PreviewDarkFeedScreenWhenDroidKaigiEnd() { onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, - isDroidKaigiEnd = remember { mutableStateOf(true) }, + isDroidKaigiEnd = true, ) { feedItem: FeedItem -> } } @@ -534,7 +532,7 @@ fun PreviewFeedScreenWithStartBlog() { onSelectedTab = {}, onNavigationIconClick = {}, onDroidKaigi2021ArticleClick = {}, - isDroidKaigiEnd = remember { mutableStateOf(false) }, + isDroidKaigiEnd = false, ) { feedItem: FeedItem -> } } diff --git a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt index eb74dba12..c424fd3be 100644 --- a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt +++ b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreenState.kt @@ -77,8 +77,6 @@ fun rememberFeedScreenState( fmPlayerViewModel: FmPlayerViewModel = fmPlayerViewModel(), scaffoldState: BackdropScaffoldState = rememberBackdropScaffoldState(BackdropValue.Concealed), context: Context = LocalContext.current, -): FeedScreenState { - return remember { - FeedScreenState(feedViewModel, fmPlayerViewModel, scaffoldState, context) - } +): FeedScreenState = remember { + FeedScreenState(feedViewModel, fmPlayerViewModel, scaffoldState, context) } diff --git a/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt b/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt index 7bab64379..e77d49d83 100644 --- a/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt +++ b/uicomponent-compose/main/src/main/java/io/github/droidkaigi/feeder/AppContent.kt @@ -124,7 +124,7 @@ fun AppContent( onDroidKaigi2021ArticleClick = { actions.onSelectDrawerItem(DrawerContents.TIMETABLE) }, - isDroidKaigiEnd = remember { mutableStateOf(DroidKaigi2021.isArticleEnd()) }, + isDroidKaigiEnd = DroidKaigi2021.isArticleEnd(), ) } composable( From 689aa760e56535f772a49abb5a1d92ff945c051b Mon Sep 17 00:00:00 2001 From: takahirom Date: Fri, 12 Nov 2021 09:08:06 +0900 Subject: [PATCH 4/4] Use function reference --- .../java/io/github/droidkaigi/feeder/feed/FeedScreen.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt index 6c47c1e03..a35eb7a90 100644 --- a/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt +++ b/uicomponent-compose/feed/src/main/java/io/github/droidkaigi/feeder/feed/FeedScreen.kt @@ -115,16 +115,12 @@ fun FeedScreen( filters = uiState.filters, onSelectTab = onSelectedTab, onNavigationIconClick = onNavigationIconClick, - onFavoriteChange = { - feedScreenState.onFavoriteChange(it) - }, + onFavoriteChange = feedScreenState::onFavoriteChange, onFavoriteFilterChanged = { feedScreenState.onFavoriteFilterChange(uiState.filters, it) }, onClickFeed = onDetailClick, - onClickPlayPodcastButton = { - feedScreenState.onPotcastPlayButtonClick(it) - }, + onClickPlayPodcastButton = feedScreenState::onPotcastPlayButtonClick, onClickDroidKaigi2021Article = onDroidKaigi2021ArticleClick, isDroidKaigiEnd = isDroidKaigiEnd )