티스토리 뷰

728x90

1.  ViewModel에 의존성이 필요한 경우 Factory 클래스를 생성하여 hilt로 생성한다. 하지만 아래처럼 바로 ViewModel에 @HiltViewModel을 사용하고 

 

 

@HiltViewModel
class MainViewModel @Inject constructor(
    private val app: Application,
    private val schoolRepository: SchoolRepository
): ViewModel() {

    private val _searchAppBarState: MutableState<SearchAppBarState> =
        mutableStateOf(SearchAppBarState.CLOSED)
    val searchAppBarState: State<SearchAppBarState> = _searchAppBarState

    private val _searchTextState: MutableState<String> = mutableStateOf("")
    val searchTextState: State<String> = _searchTextState

    fun updateSearchAppBarState(newValue: SearchAppBarState) {
        _searchAppBarState.value = newValue
        Log.i("PHILIP", "searchAppState to ${_searchAppBarState.value}")
    }

    fun updateSearchTextState(newText: String) {
        _searchTextState.value = newText
        Log.i("PHILIP", "updateSearchTextState to ${_searchTextState.value}")
    }

 

2. 아래처럼 Activity에서 아채처럼 viewModels로 생성하면  Factory 없이도 생성이 가능하다. 물론 특정한 디폴드 값이 필요한 경우에는 사용할 수 없지만 컴포넌트를 주입받아서 사용하는 일반적인 경우에는 정상적으로 동작한다.

 

@AndroidEntryPoint
class MainActivity : ComponentActivity() {
//    @Inject
//    lateinit var factory: MainViewModelFactory
    private val viewModel: MainViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {

 

3. viewModels은 factory가 인자로 주어지지 않는 경우 바로 아래 코드처럼 디폴트 factory를 기본적인 설정을 사용하는데 알아서 잘 만들어낸다. 스코프만 잘 적어주면 사용하는데 문제가 없어 보인다. 

if (mDefaultFactory == null) {
    mDefaultFactory = new SavedStateViewModelFactory(
            getApplication(),
            this,
            getIntent() != null ? getIntent().getExtras() : null);
}

 

 

728x90
댓글