Skip to content

Commit 7d78c72

Browse files
committed
🐛 dialog 두 번 띄우면 앱이 종료되는 오류 해결
1 parent 6014d8f commit 7d78c72

File tree

2 files changed

+40
-40
lines changed

2 files changed

+40
-40
lines changed
Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,24 @@
11
package com.whyranoid.presentation.myrun
22

33
import android.os.Bundle
4-
import android.view.LayoutInflater
54
import android.view.View
6-
import android.view.ViewGroup
5+
import android.widget.EditText
76
import androidx.appcompat.app.AlertDialog
8-
import androidx.databinding.DataBindingUtil
97
import androidx.fragment.app.viewModels
108
import com.whyranoid.presentation.R
119
import com.whyranoid.presentation.base.BaseFragment
12-
import com.whyranoid.presentation.databinding.DialogEditNickNameBinding
1310
import com.whyranoid.presentation.databinding.FragmentMyRunBinding
1411
import com.whyranoid.presentation.util.loadImage
12+
import com.whyranoid.presentation.util.repeatWhenUiStarted
1513
import dagger.hilt.android.AndroidEntryPoint
1614

1715
@AndroidEntryPoint
1816
internal class MyRunFragment : BaseFragment<FragmentMyRunBinding>(R.layout.fragment_my_run) {
1917

2018
private val viewModel by viewModels<MyRunViewModel>()
21-
private lateinit var dialogViewBinding: DialogEditNickNameBinding
2219

23-
override fun onCreateView(
24-
inflater: LayoutInflater,
25-
container: ViewGroup?,
26-
savedInstanceState: Bundle?
27-
): View? {
28-
dialogViewBinding =
29-
DataBindingUtil.inflate(inflater, R.layout.dialog_edit_nick_name, container, false)
30-
return super.onCreateView(inflater, container, savedInstanceState)
20+
private val builder: AlertDialog.Builder by lazy {
21+
AlertDialog.Builder(requireContext())
3122
}
3223

3324
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@@ -46,31 +37,37 @@ internal class MyRunFragment : BaseFragment<FragmentMyRunBinding>(R.layout.fragm
4637
}
4738

4839
private fun observeInfo() {
49-
viewModel.nickName.observe(viewLifecycleOwner) {
50-
binding.tvNickName.text = it
40+
repeatWhenUiStarted {
41+
viewModel.nickName.collect { nickName ->
42+
binding.tvNickName.text = nickName
43+
}
5144
}
5245

53-
viewModel.profileImgUri.observe(viewLifecycleOwner) {
54-
binding.ivProfileImage.loadImage(it)
46+
repeatWhenUiStarted {
47+
viewModel.profileImgUri.collect { profileImgUri ->
48+
binding.ivProfileImage.loadImage(profileImgUri)
49+
}
5550
}
5651
}
5752

5853
private fun popUpEditNickNameDialog() {
59-
val newNickName = dialogViewBinding.etChangeNickName
60-
61-
val builder = AlertDialog.Builder(requireContext())
62-
.setView(dialogViewBinding.root)
63-
.setPositiveButton(
64-
getString(R.string.my_run_edit_nick_name_dialog_positive)
65-
) { _, _ ->
66-
viewModel.updateNickName(newNickName.text.toString())
67-
}
68-
.setNegativeButton(
69-
getString(R.string.my_run_edit_nick_name_dialog_negative)
70-
) { dialog, _ ->
71-
dialog.dismiss()
72-
}
54+
val dialogView = layoutInflater.inflate(R.layout.dialog_edit_nick_name, null)
7355

74-
builder.show()
56+
if (dialogView.parent != null) {
57+
builder.show()
58+
} else {
59+
builder.setView(dialogView)
60+
.setPositiveButton(
61+
getString(R.string.my_run_edit_nick_name_dialog_positive)
62+
) { dialog, _ ->
63+
viewModel.updateNickName(dialogView.findViewById<EditText>(R.id.et_change_nick_name).text.toString())
64+
dialog.dismiss()
65+
}
66+
.setNegativeButton(
67+
getString(R.string.my_run_edit_nick_name_dialog_negative)
68+
) { dialog, _ ->
69+
dialog.dismiss()
70+
}.show()
71+
}
7572
}
7673
}

presentation/src/main/java/com/whyranoid/presentation/myrun/MyRunViewModel.kt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package com.whyranoid.presentation.myrun
22

3-
import androidx.lifecycle.LiveData
4-
import androidx.lifecycle.MutableLiveData
53
import androidx.lifecycle.ViewModel
64
import androidx.lifecycle.viewModelScope
75
import com.whyranoid.domain.usecase.GetNicknameUseCase
86
import com.whyranoid.domain.usecase.GetProfileUriUseCase
97
import com.whyranoid.domain.usecase.UpdateNicknameUseCase
108
import dagger.hilt.android.lifecycle.HiltViewModel
9+
import kotlinx.coroutines.flow.MutableStateFlow
10+
import kotlinx.coroutines.flow.StateFlow
11+
import kotlinx.coroutines.flow.asStateFlow
1112
import kotlinx.coroutines.launch
1213
import javax.inject.Inject
1314

@@ -18,13 +19,15 @@ class MyRunViewModel @Inject constructor(
1819
private val updateNickNameUseCase: UpdateNicknameUseCase
1920
) : ViewModel() {
2021

21-
private val _nickName = MutableLiveData<String>()
22-
val nickName: LiveData<String>
23-
get() = _nickName
22+
private val EMPTY_STRING = ""
2423

25-
private val _profileImgUri = MutableLiveData<String>()
26-
val profileImgUri: LiveData<String>
27-
get() = _profileImgUri
24+
private val _nickName = MutableStateFlow(EMPTY_STRING)
25+
val nickName: StateFlow<String>
26+
get() = _nickName.asStateFlow()
27+
28+
private val _profileImgUri = MutableStateFlow(EMPTY_STRING)
29+
val profileImgUri: StateFlow<String>
30+
get() = _profileImgUri.asStateFlow()
2831

2932
fun getNickName() {
3033
viewModelScope.launch {

0 commit comments

Comments
 (0)