【问题标题】:How to inject viewmodel factory by dagger 2如何通过匕首 2 注入视图模型工厂
【发布时间】:2021-10-20 12:46:30
【问题描述】:

试图通过向工厂提供匕首来在片段中创建视图模型,但应用程序因错误而崩溃。将注入移至另一个生命周期不起作用

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bigproject.planyourlife, PID: 13934
kotlin.UninitializedPropertyAccessException: lateinit property factory has not been initialized
    at com.bigproject.planyourlife.view.SignupFragment.getFactory(SignupFragment.kt:27)

视图模型

class SignupViewModel(private val service: AuthService) : ViewModel() {
private var email: String = ""
private var password: String = ""
private val _uiState = MutableStateFlow<SignupState>(SignupState.Success(null))
val uiState: StateFlow<SignupState> = _uiState

@Suppress("UNCHECKED_CAST")
class Factory @Inject constructor(
    private val service: AuthService
) : ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        require(modelClass == SignupViewModel::class)
        return SignupViewModel(service) as T
    }
}

片段

class SignupFragment : Fragment(R.layout.signup_page) {

    private val binding by viewBinding(SignupPageBinding::bind)
    private val signupViewModel: SignupViewModel by viewModels {
        factory
    }

    @Inject
    lateinit var factory: SignupViewModel.Factory

    override fun onAttach(context: Context) {
        context.appComponent.inject(this)
        super.onAttach(context)
    }
}

【问题讨论】:

  • 您是否将SignupViewModel.FactorySignupFragment 正确绑定到您的模块?您是否正在使用 DI 获取SignupFragment
  • @momt99 我没有使用DI获得任何片段,我不太明白它应该如何工作,因为我最近开始学习匕首

标签: android kotlin dagger-2 android-viewmodel


【解决方案1】:

首先,为您的 ViewModelFactory 创建一个模块。这对你为 Dagger 提供 ViewModelFactory 很重要。

ViewModelModule.kt

@Module
abstract class ViewModelModule {

    @Binds
    abstract fun provideViewModelFactory(factory: Factory): ViewModelProvider.Factory

    // Binds your viewmodel in here.
}

接下来,您需要将该模块包含在您的组件中。具体这里是AppComponent

AppComponent.kt

@Singleton
@Component(modules = [ViewModelModule::class, YourFragmentModule::class, YourActivityModule::class, ...])
interface AppComponent {

    @Component.Factory
    abstract class Factory : AndroidInjector.Factory<YourApplication>
}

现在,viewModelFactory 已准备好注入到您的 Fragment、Activity 中......

YourFragment.kt

class YourFragment: Fragment() {

    @Inject
    lateinit var viewModelFactory: Factory
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多