サブコンポーネントを作成する代わりに ContributesAndroidInjctor を使用してフラグメントの依存関係を注入しようとしましたが、例外がスローされます。
java.lang.IllegalArgumentException: No injector factory bound for Class<LoginFragment>
これが私がやろうとしていることです、
成分:
@Component(
dependencies = [LoginFeature.Dependencies::class],
modules = [FeatureModule::class, AndroidInjectionModule::class]
)
interface LoginFeatureMainComponent : AndroidInjector<LoginFeatureImpl> {
@Component.Factory
interface Factory {
fun create(
@BindsInstance loginFeatureImpl: LoginFeatureImpl,
loginFeature: LoginFeature.Dependencies
): LoginFeatureMainComponent
}
}
モジュール:
@Module
abstract class FeatureModule {
@ContributesAndroidInjector(modules = [ViewModelProviderModule::class])
abstract fun contributeLoginFragment(): LoginFragment
}
断片:
class FragmentNew : DaggerFragment() {
@Inject
lateinit var viewModelProviderFactory: ViewModelProviderFactory
private lateinit var binding: FragmentNewBinding
private val newViewModel: NewViewModel by viewModels { viewModelProviderFactory }
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?
= DataBindingUtil.inflate<FragmentNewBinding>(inflater, R.layout.fragment_new, container, false).run {
binding = this
viewModel = newViewModel
lifecycleOwner = viewLifecycleOwner
root
}
}
LoginFeatureImpl:
@AutoService(LoginFeature::class)
class LoginFeatureImpl : LoginFeature {
override fun inject(dependencies: LoginFeature.Dependencies) {
DaggerLoginFeatureMainComponent.factory().create(this, dependencies).apply {
inject(this@LoginFeatureImpl)
}
}
}
そして私のアクティビティは基本的にLoginFeatureImplで inject メソッドを呼び出します:
class LaunchActivity : DaggerAppCompatActivity() {
@Inject
lateinit var viewModelProviderFactory: ViewModelProviderFactory
private lateinit var binding: LaunchActivityBinding
private val viewModel: LaunchViewModel by viewModels { viewModelProviderFactory }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.launch_activity)
viewModel.launchLoginFragment() **// this calls inject in LoginFeatureImpl**
}
}
この問題に関するヘルプをいただければ幸いです。
編集: ContributesAndroidInjector に依存する代わりにサブコンポーネントを手動で作成し、DaggerFragment() から拡張する代わりに HasAndroidInjector を実装するフラグメントで inject を呼び出すと機能します。しかし、ContributesAndroidInjector を使用し、追加するすべてのフラグメントのサブコンポーネントを手動で作成しないソリューションをまだ探しています。