Skip to content

Commit 723f49b

Browse files
committed
fix the issue
1 parent b34dab8 commit 723f49b

File tree

2 files changed

+94
-37
lines changed

2 files changed

+94
-37
lines changed

subs/compose/src/main/java/com/engineer/compose/ui/ChatActivity.kt

+18-10
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import androidx.compose.material3.OutlinedTextField
2626
import androidx.compose.material3.Surface
2727
import androidx.compose.material3.Text
2828
import androidx.compose.runtime.Composable
29+
import androidx.compose.runtime.collectAsState
2930
import androidx.compose.runtime.getValue
3031
import androidx.compose.runtime.livedata.observeAsState
3132
import androidx.compose.runtime.mutableStateOf
@@ -77,7 +78,8 @@ fun ChatScreen(
7778
@PreviewParameter(ChatUIWithKeyboardPre::class, 1) chatUIWithKeyboard: ChatUIWithKeyboard
7879
) {
7980
var inputValue by remember { mutableStateOf("") }
80-
val msg by viewModel.messageList.observeAsState()
81+
val msg by viewModel.messageList.observeAsState(ArrayList<ChatMessage>())
82+
val msg1 by viewModel.messages.collectAsState()
8183
val temp = provideTestChat()
8284
val kk by viewModel.kkk.observeAsState("11")
8385

@@ -89,8 +91,15 @@ fun ChatScreen(
8991

9092
Column(modifier = Modifier.fillMaxSize()) {
9193
Text(text = kk, modifier = Modifier.size(1.dp))
94+
LazyColumn(
95+
96+
) {
97+
items(msg.size, key = { it }, contentType = {msg[it].sender}) { index ->
98+
ChatMessageItem(message = msg[index])
99+
}
100+
}
92101
// 消息列表
93-
MessageList(messages = msg, modifier = Modifier.weight(1f))
102+
MessageList(messages = msg1, modifier = Modifier.weight(1f))
94103
// 输入框和发送按钮
95104
InputArea(inputValue = inputValue, viewModel = viewModel, messageText = {
96105
inputValue = it
@@ -141,15 +150,13 @@ fun InputArea(
141150
}
142151

143152
@Composable
144-
fun MessageList(messages: ArrayList<ChatMessage>?, modifier: Modifier) {
153+
fun MessageList(messages: List<ChatMessage>, modifier: Modifier) {
145154
Log.d("TAG_TAG", "msg $messages")
146-
messages?.let {
147-
LazyColumn(
148-
modifier = modifier
149-
) {
150-
items(messages.size, key = { it }) { index ->
151-
ChatMessageItem(message = messages[index])
152-
}
155+
LazyColumn(
156+
modifier = modifier
157+
) {
158+
items(messages.size, key = { messages[it].text }) { index ->
159+
ChatMessageItem(message = messages[index])
153160
}
154161
}
155162

@@ -226,4 +233,5 @@ fun ProfilePicture(resId: Int, modifier: Modifier = Modifier) {
226233

227234
fun sendMessage(viewModel: ChatViewModel, message: String) {
228235
viewModel.query(message)
236+
// viewModel.queryFlow(message)
229237
}

subs/compose/src/main/java/com/engineer/compose/viewmodel/ChatViewModel.kt

+76-27
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import android.util.Log
66
import androidx.lifecycle.LiveData
77
import androidx.lifecycle.MutableLiveData
88
import androidx.lifecycle.ViewModel
9+
import androidx.lifecycle.viewModelScope
10+
import kotlinx.coroutines.delay
11+
import kotlinx.coroutines.flow.MutableStateFlow
12+
import kotlinx.coroutines.flow.StateFlow
13+
import kotlinx.coroutines.launch
914

1015
class ChatViewModel : ViewModel() {
1116
private val TAG = "ChatViewModel"
@@ -49,42 +54,86 @@ class ChatViewModel : ViewModel() {
4954
val mockResponse =
5055
"天空呈现蓝色的原因主要与光的散射有关。当太阳光进入大气层后,大气中的气体分子和悬浮微粒会对阳光进行散射".toCharArray()
5156
val sb = StringBuffer()
57+
sendData(sb, mockResponse)
58+
}
5259

53-
val subThread = true
54-
if (subThread) {
55-
Thread {
56-
sendData(sb, mockResponse, subThread)
57-
}.start()
58-
} else {
59-
sendData(sb, mockResponse, subThread)
60+
private fun sendData(sb: StringBuffer, mockResponse: CharArray) {
61+
viewModelScope.launch {
62+
for (c in mockResponse) {
63+
val history = _messageList.value ?: ArrayList()
64+
val lastMsg = history.last()
65+
sb.append(c)
66+
kkk.postValue(sb.toString())
67+
if (lastMsg.sender == "Bot") {
68+
val newMsg = ChatMessage("Bot", sb.toString(), false)
69+
history[history.size -1 ] = newMsg
70+
71+
_messageList.value = ArrayList(history)
72+
73+
} else {
74+
val newMsg = ChatMessage("Bot", sb.toString(), false)
75+
history.add(newMsg)
76+
_messageList.value = history
77+
}
78+
// _messageList.postValue(history)
79+
80+
delay(10)
81+
Log.d(TAG, "history ${_messageList.value}")
82+
}
6083
}
6184

62-
//
6385

6486
}
6587

66-
private fun sendData(sb: StringBuffer, mockResponse: CharArray, subThread: Boolean) {
67-
68-
for (c in mockResponse) {
69-
val history = _messageList.value ?: ArrayList()
70-
val lastMsg = history.last()
71-
sb.append(c)
72-
kkk.postValue(sb.toString())
73-
if (lastMsg.sender == "Bot") {
74-
val newMsg = ChatMessage("Bot", sb.toString(), false)
75-
history[history.size - 1] = newMsg
76-
} else {
77-
val newMsg = ChatMessage("Bot", sb.toString(), false)
78-
history.add(newMsg)
88+
private val _messages = MutableStateFlow<List<ChatMessage>>(emptyList())
89+
val messages: StateFlow<List<ChatMessage>> = _messages
90+
91+
fun addMessage(message: ChatMessage) {
92+
_messages.value = _messages.value + message
93+
}
94+
95+
// 更新特定 index 的消息
96+
fun updateMessageAt(index: Int, newMessage: ChatMessage) {
97+
_messages.value = _messages.value.toMutableList().apply {
98+
if (index in indices) {
99+
this[index] = newMessage
79100
}
80-
Log.d(TAG, "history $history")
101+
}
102+
}
81103

82-
if (subThread) {
83-
_messageList.postValue(history)
84-
Thread.sleep(10)
85-
} else {
86-
_messageList.value = history
104+
// 模拟流式添加消息
105+
fun startReceivingMessages() {
106+
var i = 0
107+
val mockResponse =
108+
"天空呈现蓝色的原因主要与光的散射有关。当太阳光进入大气层后,大气中的气体分子和悬浮微粒会对阳光进行散射".toCharArray()
109+
val sb = StringBuffer()
110+
111+
112+
113+
viewModelScope.launch {
114+
for (c in mockResponse) {
115+
val history = _messages.value ?: ArrayList()
116+
val lastMsg = history.last()
117+
sb.append(c)
118+
kkk.postValue(sb.toString())
119+
if (lastMsg.sender == "Bot") {
120+
val newMsg = ChatMessage("Bot", sb.toString(), false)
121+
updateMessageAt(history.size - 1, newMsg)
122+
} else {
123+
val newMsg = ChatMessage("Bot", sb.toString(), false)
124+
addMessage(newMsg)
125+
}
126+
Log.d(TAG, "history $history")
127+
delay(20)
87128
}
129+
130+
88131
}
89132
}
133+
134+
fun queryFlow(userQuery: String) {
135+
val userMsg = ChatMessage("IAM四十二", userQuery, true)
136+
addMessage(userMsg)
137+
startReceivingMessages()
138+
}
90139
}

0 commit comments

Comments
 (0)