当前位置: 首页 > 知识库问答 >
问题:

如何用Kotlin通过匕首2.11注射SP?

米承嗣
2023-03-14

我在用匕首2对付科特林。所有工作都很好,但是当我试图将SharedPreferences注入活动时,我的项目甚至不能创建。Gradle控制台说:

di\appcomponent.java:6:error:[dagger.android.androidinjector.inject(T)]android.content.sharedpreferences不是nullable,而是由@org.jetbrains.annotations.nullable@android.support.annotation.nullable@singleton@provid.content.sharedpreferences myapp.di.modules.sharedpreferences提供的

E:public抽象接口AppComponent{E:^E:
at:android.content.sharedPreferences注入到E:
myapp.mvp.startscreen.startactivity.sharedPref E:
myapp.mvp.startscreen.startscreen.startactivity注入到E:
dagger.androidinjector.inject(arg0)E:java.lang.IllegalStateException:未能分析

SharedPreferencesModule:

    @Module
class SharedPrefModule{

    @Provides
    @Singleton
     fun providePreferences (context : Context): SharedPreferences? {
        return context.getSharedPreferences(SHARED_PREFERENCES_SETTINGS, Context.MODE_PRIVATE)
    }
}

AppComponent:

    @Singleton
@Component(modules=arrayOf(AppModule::class, AndroidSupportInjectionModule::class,
        SharedPrefModule::class, ActivityBuilder::class))
interface AppComponent {

    fun inject (app:App)

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(context: Application): Builder

        fun build(): AppComponent
    }
}
class App : Application(),HasActivityInjector {
    @Inject
    lateinit var activityInjector : DispatchingAndroidInjector<Activity>

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

    }

    override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}

活动:

class StartActivity: AppCompatActivity(), HasActivityInjector {

    @Inject
    lateinit var activityInjector : DispatchingAndroidInjector<Activity>

    @Inject
    lateinit var sharedPref : SharedPreferences

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.start_activity_layout)

//        var data = sharedPref.getString(SHARED_PREFERENCES_SETTINGS, "")
//        Log.d("tag", "data - $data")
    }

    override fun activityInjector(): AndroidInjector<Activity> = activityInjector
}

共有1个答案

鱼阳伯
2023-03-14

SharedPrefPreferences module使用上下文来创建SharedPreferences实例,由于不包括提供上下文的任何模块,因此Dagger可能无法创建SharedPreferences实例。

 类似资料:
  • 这很好,但是如果我使用全局组件甚至子组件中的一个模块,那么应该传入上下文。因此,这意味着如果我用匕首注入演示器,它将被绑定到ApplicationContext。这使得作为JUnit进行测试变得困难。Android代码不应该在演示器中。 所以我想问的是,最好的做法是只在活动、片段、广播接收器和服务中使用匕首吗?就mvp架构而言,这就是。另一个解决方案是设计另一个dagger组件,但不是与appco

  • 我不熟悉匕首和莫基托。我尝试在单元测试中使用Dagger模块中定义的构造函数,以便使用默认值创建对象。 这是模块: @模块类自动关闭倒计时模块{ 这就是我在单元测试中模拟AutoCloseCountDown类的方法: @RunWith(MockitoJUnitRunner.class)公共类AutoCloseCountDownTimerTest{ 如何实现自动关闭的CountDownTimer将在

  • 嗨,我试图找出如何做一个干净的第三方注入。我想把奥托巴士适当地注入我的服务和活动中。我看到你可以在构造函数上使用inject,但是由于我没有任何Android构造函数,我想知道我如何才能inject我的总线。 Iv创建了一个模块,该模块提供了总线的新实例。Iv还创建了一个组件,该组件具有总线对象的接口。 但是我如何才能得到这个注入,我应该在哪里启动我的图表? 我想做的就是: 我看了这个例子(htt

  • 我正在MVVM和Dagger 2中制作小型Android应用程序。但是我不知道如何正确使用Dagger 2,以防我有一个活动和两个片段。这两个片段都是ViewModels的所有者。我已经将ViewModelProvider注入了片段,但我仍然对这个解决方案感到困惑。也许有人会改进我的代码? 活动: 第一个片段: 第二个片段: 在这种情况下,两个片段都可以工作,但我只能在其中一个片段中注入ViewM

  • 我使用Flink(最新的git)从Kafka流到卡桑德拉。为了简化单元测试,我通过dagger添加了依赖注入。 ObjectGraph似乎正确地设置了自己,但是“内部对象”被Flink标记为“不可序列化”。如果我直接包括这些对象,它们会起作用--那么有什么区别呢? 通过Dagger Lazy 实例化的对象也不会序列化。 线程“main”org.apache.flink.api.common.inv

  • 我是新手,我想在我的课上注入上下文和网络(使用改型)。 这是我到目前为止的代码: 这是我的组件: 但是我如何在应用程序类中使用注入器,这是没有意义的