1. Model(Model.kt)
object Model {
private val users = ArrayList<User>()
init {
users+=User("test1","test1","test1")
users+=User("test2","test2","test2")
}
fun AddUser(user: User)=users.add(user)
fun ReturnIds()=users.map(){it.id} as ArrayList<String>
}
data class User(val name:String, val id:String, val password:String)
-아무곳에서 수정할 수 없게 유저 데이터는 private로 만들었고 ViewModel 생성시 필요한 id목록과 ViewModel에서 Model을 수정할 수 있게 해주는 함수들을 각각 만들었다.
2. ViewModel(ViewModel.kt)
class ViewModel {
private var ids = ArrayList<String>()
init {
ids = Model.ReturnIds()
}
fun Assign(user: User): String {
if (user.id.isEmpty() || user.name.isEmpty() || user.password.isEmpty()) {
return "이름, 아이디, 비밀번호 모두 입력해주세요"
} else if (ids.contains(user.id)) {
return "이미 존재하는 아이디입니다."
} else {
ids += user.id
Model.AddUser(user)
return "이름: ${user.name}, 아이디:${user.id}, 패스워드:${user.password}"
}
}
}
-데이터를 가공, 처리하기 위해 Assign 함수 생성
-토스트 메시지를 띄우기 위해서는context가 필요한데 ViewModel이 토스트 메시지를 띄우려고 context를 받아오면 종속성이 생기므로 토스트로 띄워주기위해 가공된 데이터를 View로 보내주기만 한다.
@ViewModel은 View를 몰라야 함!
3. View(LoginFragment.kt)
class LoginFragment : Fragment() {
private var _binding:FragmentLoginBinding? = null
private val binding get() = _binding!!
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding=FragmentLoginBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.asignButton.setOnClickListener{
val id=binding.editTextTextId.text.toString()
val name=binding.editTextTextName.text.toString()
val pw=binding.editTextTextPw.text.toString()
Toast.makeText(activity, viewModel.Assign(User(name,id, pw)), Toast.LENGTH_SHORT).show()
Log.d("data","${Model.ReturnIds()}")
}
}
companion object {
@JvmStatic
private val viewModel=ViewModel()
}
override fun onDestroyView() {
super.onDestroyView()
_binding=null
}
}
-뷰모델과 뷰의 관계는 1대 다수이므로 companion object에 viewModel을 넣어둔다.
- 요청사항인 회원가입을 위해 관련 데이터를 User클래스로 캡슐화시켜 ViewModel로 보내준다.
'코틀린 개인 과제' 카테고리의 다른 글
연락처 리스트앱 구현 (0) | 2024.07.18 |
---|---|
AppleMarket 구현 과제 (0) | 2024.07.15 |
챌린지반 3주차 첫번째 과제: 디자인 패턴 구현 (0) | 2024.07.09 |
로그인 앱 제작-2 (0) | 2024.06.25 |
로그인 앱 제작 (0) | 2024.06.19 |