【问题标题】:fragment cannot be provided without an @Provides-annotated method. Kotlin如果没有 @Provides-annotated 方法,就无法提供片段。科特林
【发布时间】:2019-03-09 20:14:21
【问题描述】:

我的应用类

class MyApp : Application(), HasActivityInjector {

@Inject
lateinit var activityInjector: DispatchingAndroidInjector<Activity>

/*@Inject
lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>*/

override fun onCreate() {
    super.onCreate()
    DaggerAppComponent.builder().application(this).build().inject(this)
}

override fun activityInjector(): AndroidInjector<Activity> = 
activityInjector
//override fun supportFragmentInjector(): AndroidSupportInjection<Fragment> 
= fragmentInjector
}

应用组件

@Singleton
@Component(modules = arrayOf(AndroidInjectionModule::class, 
AppModule::class, BuilderModule::class))
interface AppComponent {
@Component.Builder
interface Builder {
    @BindsInstance
    fun application(application: Application): Builder

    fun build(): AppComponent
}

fun inject(app: MyApp)

}

应用模块

@Module
class AppModule {
   @Provides
   @Singleton
   fun provideUtil(application: Application): Utils = Utils(application)
}

生成器模块

@Module
abstract class BuilderModule {
   @ContributesAndroidInjector
   abstract fun contributeMainActivity(): MainActivity

   @ContributesAndroidInjector
   abstract fun contributeHomeFragment(): HomeFragment
}

主要活动

class MainActivity : AppCompatActivity(), HasSupportFragmentInjector {

   @Inject
   lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>

   override fun supportFragmentInjector(): AndroidInjector<Fragment> = 
   fragmentInjector


   override fun onCreate(savedInstanceState: Bundle?) {
       AndroidInjection.inject(this); // Call before super!
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)

       replaceFragment(HomeFragment())
    }

    fun replaceFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.frameContainer, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }
}

首页片段

class HomeFragment : Fragment() {

   @Inject
   lateinit var utils: Utils

   override fun onAttach(context: Context?) {
      AndroidSupportInjection.inject(this) // Providing the dependency
      super.onAttach(context)
   }

   override fun onCreateView(inflater: LayoutInflater, container: 
   ViewGroup?, savedInstanceState: Bundle?): View? {
     // Inflate the layout for this fragment
     return inflater.inflate(R.layout.fragment_home, container, false)
   }

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
      super.onViewCreated(view, savedInstanceState)
      utils.toaster("Injected")
   }

我收到此错误 D:\Workspace\DaggerKotlin\app\build\tmp\kapt3\stubs\debug\com\cvsingh\daggerkotlin\di\AppComponent.java:8: 错误:[Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T )] java.util.Map>> 不能在没有@Provides-annotated 方法的情况下提供。 公共抽象接口 AppComponent { ^ java.util.Map>> 注入于 dagger.android.DispatchingAndroidInjector.(…, injectorFactoriesWithStringKeys) dagger.android.DispatchingAndroidInjector 被注入 com.cvsingh.daggerkotlin.ui.MainActivity.fragmentInjector com.cvsingh.daggerkotlin.ui.MainActivity 在注入 dagger.android.AndroidInjector.inject(T) 组件路径:com.cvsingh.daggerkotlin.di.AppComponent ? com.cvsingh.daggerkotlin.di.BuilderModule_ContributeMainActivity.MainActivitySubcomponent

}

【问题讨论】:

  • 认为你需要使用AndroidSupportInjectionModule而不是AndroidInjectionModule
  • 感谢@DavidMedenjak,这解决了我的问题。

标签: kotlin dagger-2 dagger


【解决方案1】:

你的 MyApp 类做错了,你应该使用 DaggerApplication 来简化你的匕首集成:

class MyApp : DaggerApplication() {
    private val applicationInjector = DaggerApplicationComponent.builder()
        .application(this)
        .build()

    override fun applicationInjector() = applicationInjector
}

为了您的信息,您可以使用DaggerAppCompatActivityDaggerFragment 以同样的方式简化您的活动和片段

例如,您的活动可能是:

class MainActivity : DaggerAppCompatActivity(){

   override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
       setContentView(R.layout.activity_main)

       replaceFragment(HomeFragment())
    }

    fun replaceFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.frameContainer, fragment)
        transaction.addToBackStack(null)
        transaction.commit()
    }
}

如果您不想使用DaggerApplicationDaggerAppCompatActivity 等。(有时您需要从另一个类扩展),那么只需在您的类中复制DaggerApplicationDaggerAppCompatActivity 等的粘贴代码

【讨论】:

    猜你喜欢
    • 2021-08-22
    • 2023-03-06
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    相关资源
    最近更新 更多