2017-09-25 87 views
-1

有人帮我指出为什么我的代码不起作用。我揣摩,但我不能找出问题 我尝试注入主持人,但我得到了错误:匕首注射不在kotlin中工作

lateinit property appComponent has not been initialized 

看来,主持人一直没有注入 的AppModule

@Module 
class AppModule { 
    @Provides @Singleton 
    fun provideMainPresenter(): MainActivityContract.Presenter = MainActivityPresenter() 
} 

AppComponent

@Singleton 
@Component(modules = arrayOf(AppModule::class)) 
interface AppComponent { 

    fun inject(target: MainActivity) 

} 

应用

class App: Application() { 

    companion object { 
     lateinit var appComponent: AppComponent 
    } 

    override fun onCreate() { 
     super.onCreate() 
     appComponent = initDagger() 
    } 

    fun initDagger() = DaggerAppComponent.create() 
} 

这就是我想要注入演示者

class MainActivity : AppCompatActivity(), MainActivityContract.View, AnkoLogger { 

    @Inject 
    lateinit var presenter: MainActivityContract.Presenter 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_main) 
     App.appComponent.inject(this) 
     presenter.attachView(this) 
    } 

} 

这是MainActivityPresenter它实现MainActivityContract.Presenter

class MainActivityPresenter: MainActivityContract.Presenter { 
    var view: MainActivityContract.View? = null 

    override fun attachView(view: MainActivityContract.View) { 
     this.view = view 
    } 

    override fun detachView() { 
     view = null 
    } 

    override fun performToast(text: String) { 
    } 

} 

编辑在MainActivity:我设法解决它自己: 对于所有因为我是Android初学者。当我们声明App extends Application时。我们必须体现其声明以及

<application 
     android:name=".App" 
/> 
+0

什么样的错误? – Blackbelt

+0

为什么不工作?请添加错误堆栈跟踪或... –

+0

更新我的问题。 Retrofit无法提供演示者 –

回答

0

你不能定义一个静态变量为lateinit,并期望onCreate()进行初始化。尝试是这样的:

class GlobalApplication : Application() { 
    companion object { 
     lateinit var globalApp: GlobalApplication 
    } 

    internal var mApplicationComponent: ApplicationComponent? = null 
     get 

    override fun onCreate() { 
     super.onCreate() 
     globalApp = this 

     //Init Timber 
     if (BuildConfig.DEBUG) { 
      Timber.plant(Timber.DebugTree()) 
     } 

     //Init application component 
     mApplicationComponent = DaggerApplicationComponent.builder() 
       .applicationModule(ApplicationModule(this)) 
       .build() 

     mApplicationComponent?.inject(this) 

     //Ignore URI exposure 
     val builder = StrictMode.VmPolicy.Builder() 
     StrictMode.setVmPolicy(builder.build()) 
    } 
} 

从这个项目摘自:https://github.com/Obaied/Sohan/blob/master/app/src/main/java/com/obaied/sohan/GlobalApplication.kt

1

在MainActivity,您可以替换代码:

@Inject 
lateinit var presenter: MainActivityContract.Presenter 

@field:[Inject] 
lateinit var presenter: MainActivityContract.Presenter 
+0

你能解释为什么吗?我见过很多使用@Inject –

+0

它不起作用 –