refactor: Scope statsviewmodel to activity instead of composable to improve performance

This commit is contained in:
Nishant Mishra
2025-07-12 22:50:17 +05:30
parent aa5160148b
commit 954eb47086
4 changed files with 15 additions and 11 deletions

View File

@@ -8,19 +8,21 @@ import androidx.activity.viewModels
import org.nsh07.pomodoro.ui.AppScreen
import org.nsh07.pomodoro.ui.NavItem
import org.nsh07.pomodoro.ui.Screen
import org.nsh07.pomodoro.ui.statsScreen.viewModel.StatsViewModel
import org.nsh07.pomodoro.ui.theme.TomatoTheme
import org.nsh07.pomodoro.ui.timerScreen.viewModel.TimerViewModel
class MainActivity : ComponentActivity() {
private val viewModel: TimerViewModel by viewModels(factoryProducer = { TimerViewModel.Factory })
private val timerViewModel: TimerViewModel by viewModels(factoryProducer = { TimerViewModel.Factory })
private val statsViewModel: StatsViewModel by viewModels(factoryProducer = { StatsViewModel.Factory })
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
TomatoTheme {
AppScreen(viewModel = viewModel)
AppScreen(timerViewModel = timerViewModel, statsViewModel = statsViewModel)
}
}
}

View File

@@ -46,6 +46,7 @@ import androidx.window.core.layout.WindowSizeClass
import org.nsh07.pomodoro.MainActivity.Companion.screens
import org.nsh07.pomodoro.ui.settingsScreen.SettingsScreenRoot
import org.nsh07.pomodoro.ui.statsScreen.StatsScreenRoot
import org.nsh07.pomodoro.ui.statsScreen.viewModel.StatsViewModel
import org.nsh07.pomodoro.ui.timerScreen.TimerScreen
import org.nsh07.pomodoro.ui.timerScreen.viewModel.TimerViewModel
@@ -53,10 +54,11 @@ import org.nsh07.pomodoro.ui.timerScreen.viewModel.TimerViewModel
@Composable
fun AppScreen(
modifier: Modifier = Modifier,
viewModel: TimerViewModel = viewModel(factory = TimerViewModel.Factory)
timerViewModel: TimerViewModel = viewModel(factory = TimerViewModel.Factory),
statsViewModel: StatsViewModel = viewModel(factory = StatsViewModel.Factory)
) {
val uiState by viewModel.timerState.collectAsStateWithLifecycle()
val remainingTime by viewModel.time.collectAsStateWithLifecycle()
val uiState by timerViewModel.timerState.collectAsStateWithLifecycle()
val remainingTime by timerViewModel.time.collectAsStateWithLifecycle()
val progress by rememberUpdatedState((uiState.totalTime.toFloat() - remainingTime) / uiState.totalTime)
@@ -137,7 +139,7 @@ fun AppScreen(
TimerScreen(
timerState = uiState,
progress = { progress },
onAction = viewModel::onAction,
onAction = timerViewModel::onAction,
modifier = modifier.padding(
start = contentPadding.calculateStartPadding(layoutDirection),
end = contentPadding.calculateEndPadding(layoutDirection),
@@ -158,6 +160,7 @@ fun AppScreen(
entry<Screen.Stats> {
StatsScreenRoot(
viewModel = statsViewModel,
modifier = modifier.padding(
start = contentPadding.calculateStartPadding(layoutDirection),
end = contentPadding.calculateEndPadding(layoutDirection),

View File

@@ -68,10 +68,10 @@ fun StatsScreenRoot(
) {
val todayStat by viewModel.todayStat.collectAsState(null)
StatsScreen(
lastWeekSummaryChartData = viewModel.lastWeekSummaryChartData,
lastWeekSummaryAnalysisModelProducer = viewModel.lastWeekSummaryAnalysisModelProducer,
lastMonthSummaryChartData = viewModel.lastMonthSummaryChartData,
lastMonthSummaryAnalysisModelProducer = viewModel.lastMonthSummaryAnalysisModelProducer,
lastWeekSummaryChartData = remember { viewModel.lastWeekSummaryChartData },
lastWeekSummaryAnalysisModelProducer = remember { viewModel.lastWeekSummaryAnalysisModelProducer },
lastMonthSummaryChartData = remember { viewModel.lastMonthSummaryChartData },
lastMonthSummaryAnalysisModelProducer = remember { viewModel.lastMonthSummaryAnalysisModelProducer },
todayStat = todayStat,
modifier = modifier
)

View File

@@ -111,7 +111,6 @@ internal fun TimeColumnChart(
minZoom = Zoom.min(Zoom.Content, Zoom.fixed())
),
animationSpec = animationSpec,
animateIn = false,
modifier = modifier,
)
}