feat: 实现我的页

纯静态入口列表(头像卡 + 应用设置 / 关于 两组入口),无 ViewModel、无状态。
新增 12 条 profile_* 文案资源,颜色统一走设计系统 TextSecondary。
This commit is contained in:
2026-09-10 12:17:11 +08:00
parent 7170a49664
commit 88e88cf0ba
2 changed files with 137 additions and 4 deletions
@@ -1,18 +1,138 @@
package com.placeholder.ringhealth.feature.profile
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.AccountCircle
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Notifications
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.placeholder.ringhealth.R
import com.placeholder.ringhealth.core.designsystem.MetricGreen
import com.placeholder.ringhealth.core.designsystem.RingHealthTheme
import com.placeholder.ringhealth.core.designsystem.TextSecondary
import com.placeholder.ringhealth.core.designsystem.component.HealthCard
import com.placeholder.ringhealth.core.designsystem.component.SectionHeader
/** 我的页(占位,待 Task 11 实现)。 */
/**
* “我的”页。全部为静态入口,无状态、无 ViewModel。
*
* 本页**不需要**再拆「有状态外壳 + 无状态内容」(ledger Ruling R26 的常规形状):
* 它本身就是无状态的,直接对它挂 `@Preview` 即可。
*/
@Composable
fun ProfileScreen(modifier: Modifier = Modifier) {
Box(modifier = modifier.fillMaxSize(), contentAlignment = Alignment.Center) {
Text(stringResource(R.string.tab_profile))
LazyColumn(
modifier = modifier.fillMaxSize(),
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(12.dp),
) {
item {
HealthCard {
Row(verticalAlignment = Alignment.CenterVertically) {
Icon(
imageVector = Icons.Filled.AccountCircle,
contentDescription = null,
tint = MetricGreen,
modifier = Modifier.size(48.dp),
)
Column(modifier = Modifier.padding(start = 12.dp)) {
Text(
text = stringResource(R.string.profile_nickname),
style = MaterialTheme.typography.titleMedium,
)
Text(
text = stringResource(R.string.profile_login_hint),
style = MaterialTheme.typography.bodySmall,
color = TextSecondary,
)
}
}
}
}
item { SectionHeader(title = stringResource(R.string.profile_group_app)) }
item {
ProfileEntry(
icon = Icons.Filled.Settings,
title = stringResource(R.string.profile_units),
subtitle = stringResource(R.string.profile_units_desc),
)
}
item {
ProfileEntry(
icon = Icons.Filled.Notifications,
title = stringResource(R.string.profile_notification),
subtitle = stringResource(R.string.profile_notification_desc),
)
}
item { SectionHeader(title = stringResource(R.string.profile_group_about)) }
item {
ProfileEntry(
icon = Icons.Filled.Refresh,
title = stringResource(R.string.profile_check_update),
subtitle = stringResource(R.string.profile_check_update_desc),
)
}
item {
ProfileEntry(
icon = Icons.Filled.Info,
title = stringResource(R.string.profile_help),
subtitle = stringResource(R.string.profile_help_desc),
)
}
}
}
/** 单条设置入口。 */
@Composable
private fun ProfileEntry(
icon: ImageVector,
title: String,
subtitle: String,
modifier: Modifier = Modifier,
) {
HealthCard(modifier = modifier) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(
imageVector = icon,
contentDescription = null,
tint = TextSecondary,
modifier = Modifier.size(20.dp),
)
Column(modifier = Modifier.padding(start = 12.dp)) {
Text(text = title, style = MaterialTheme.typography.titleSmall)
Text(text = subtitle, style = MaterialTheme.typography.bodySmall, color = TextSecondary)
}
}
}
}
/** 预览入口:直接渲染 [ProfileScreen](本页无状态、无示例数据),便于在 IDE 中免真机查看“我的”页效果。 */
@Preview(showBackground = true)
@Composable
private fun ProfileScreenPreview() {
RingHealthTheme {
ProfileScreen()
}
}
+13
View File
@@ -54,4 +54,17 @@
<string name="device_switch_on">已开启</string>
<string name="device_switch_off">已关闭</string>
<string name="device_settings_hint">阶段一为演示开关,接入戒指后将同步到设备。</string>
<string name="profile_nickname">健康用户</string>
<string name="profile_login_hint">登录后可同步数据(阶段一未开放)</string>
<string name="profile_group_app">应用设置</string>
<string name="profile_units">单位设置</string>
<string name="profile_units_desc">公里 / 公斤</string>
<string name="profile_notification">通知权限</string>
<string name="profile_notification_desc">接收健康提醒</string>
<string name="profile_group_about">关于</string>
<string name="profile_check_update">检查更新</string>
<string name="profile_check_update_desc">当前版本 0.1.0</string>
<string name="profile_help">帮助与反馈</string>
<string name="profile_help_desc">常见问题与意见反馈</string>
</resources>