This commit is contained in:
Eric85710 2026-05-18 15:46:41 +08:00
parent 8bbf1cfb27
commit 7f0047033a
3 changed files with 11 additions and 33 deletions

View file

@ -45,24 +45,16 @@ fun MessageMessaging(
onBackClick: () -> Unit,
viewModel: ChatViewModel = hiltViewModel()
) {
// 加上 collectAsStateWithLifecycle() 轉換它
val uiState by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(roomId) {
viewModel.loadMessages(roomId)
Log.d("ChatDebug", "UI State 變更為: ${uiState::class.simpleName}")
}
Scaffold(
topBar = {
TopAppBar(
title = { Text("聊天室 ($roomId)") },
navigationIcon = {
IconButton(onClick = onBackClick) {
Text("<")
}
}
)
}
) { innerPadding ->
@ -96,7 +88,7 @@ fun MessageMessaging(
@Composable
fun MessageList(
messages: List<Message>, // 這裡是正確的 Message
messages: List<Message>,
modifier: Modifier = Modifier
) {
val currentUserId = "user_123"
@ -106,7 +98,6 @@ fun MessageList(
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(8.dp)
) {
// items 內部拿到的 message 會依循 List<Message> 的型態
items(messages) { message ->
val isMe = message.senderId == currentUserId
MessageRow(message = message, isMe = isMe)
@ -116,7 +107,7 @@ fun MessageList(
@Composable
fun MessageRow(
message: Message, // ✅ 修正這裡:將 Screen.Message 改為 Message
message: Message,
isMe: Boolean
) {
Row(
@ -140,13 +131,13 @@ fun MessageRow(
Column {
if (!isMe) {
Text(
text = message.senderId, // ✅ 這樣型態對了,就能抓到欄位了!
text = message.senderId,
style = MaterialTheme.typography.labelSmall,
color = Color.Gray
)
}
Text(
text = message.content, // ✅ 這樣型態對了,就能抓到欄位了!
text = message.content,
style = MaterialTheme.typography.bodyMedium
)
}

View file

@ -89,9 +89,8 @@ sealed class Screen(val route: String) {
object ScanQRcode : Screen("scan_QRcode")
object MessageMessaging : Screen("message_messaging?roomId={roomId}") {
fun createRoute(roomId: String): String {
val encodedId = java.net.URLEncoder.encode(roomId, "UTF-8")
// 2. 修改這裡:帶入對應的格式
return "message_messaging?roomId=$encodedId"
// 🚀 修正:直接帶入原始 roomId,不進行 URL Encode
return "message_messaging?roomId=$roomId"
}
}
}
@ -139,23 +138,17 @@ fun Tg_Message(
//Message detail
composable(
route = Screen.MessageMessaging.route, // 現在是 "message_messaging?roomId={roomId}"
route = Screen.MessageMessaging.route,
arguments = listOf(
navArgument("roomId") {
type = NavType.StringType
nullable = true // 查詢參數建議改為允許為空
defaultValue = "" // 給予預設值
nullable = true
defaultValue = ""
}
)
) { backStackEntry ->
// 這裡維持你寫好的安全解碼邏輯
val encodedRoomId = backStackEntry.arguments?.getString("roomId").orEmpty()
val roomId = try {
java.net.URLDecoder.decode(encodedRoomId, "UTF-8")
} catch (e: Exception) {
encodedRoomId
}
// 🚀 修正:直接抓取 arguments 的字串,不再進行 URL Decode
val roomId = backStackEntry.arguments?.getString("roomId").orEmpty()
MessageMessaging(
roomId = roomId,

View file

@ -29,22 +29,16 @@ class ChatViewModel @Inject constructor(
val uiState: StateFlow<MessagesUiState> = _uiState.asStateFlow()
fun loadMessages(roomId: String) {
// 🔴 Debug 1: 檢查傳進來的 roomId 是不是正確的,還是空的、被錯誤編碼的?
Log.d("ChatDebug", "ViewModel: loadMessages 開始執行, roomId = '$roomId'")
viewModelScope.launch {
_uiState.value = MessagesUiState.Loading
repository.getChatMessages(roomId)
.onSuccess { response ->
// 🔴 Debug 2: 檢查後端有沒有正確回傳,數量是多少?
Log.d("ChatDebug", "ViewModel: API 請求成功, 訊息數量 = ${response.messages.size}")
_uiState.value = MessagesUiState.Success(messages = response.messages)
}
.onFailure { exception ->
// 🔴 Debug 3: 檢查是不是 API 報錯(例如 404, 500)或是解析 JSON 失敗
Log.e("ChatDebug", "ViewModel: API 請求失敗", exception)
_uiState.value = MessagesUiState.Error(message = exception.message ?: "未知錯誤")
}