UninitializedPropertyAccessException: префикс свойства lateinit не был инициализирован - PullRequest
0 голосов
/ 29 мая 2018

Я знаю, что на этот вопрос был дан ответ [Здесь] ( свойство lateinit не было инициализировано ).Но это было из-за проблемы с библиотекой ножей для масла. Но мой случай другой.совершенно разные.В моем случае, когда я использую свойства, внедренные в кинжал, в моей основной деятельности, это показывает мне ошибку Причина: kotlin.UninitializedPropertyAccessException: свойство lateinit pref не было инициализировано

Но то же свойство, когда я использую вмоя суб активность (логин) работает нормально.

например. pref.setLanguage ("abc") -> работает нормально при входе в систему, но выдает ошибку при базовой активности

Вот мой код:

BaseActivity

abstract class BaseActivity : AppCompatActivity() {
@Inject
lateinit var pref: AppSharedPreferences
@Inject
lateinit var utils: Utils
lateinit var mCurrentLanguage: String
protected lateinit var progressBarUtils: ProgressBarUtils

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    progressBarUtils = ProgressBarUtils(this)
    mCurrentLanguage = "EN"
    pref.setSelectedLanguage(mCurrentLanguage)   
}
}

LoginActivity

class LoginActivity : BaseActivity() {
private val TAG = this.javaClass.name
lateinit var loginViewModel: LoginViewModel
@Inject
lateinit var viewModelFactory: LoginViewModelFactory


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_login)
    AndroidInjection.inject(this)
    loginViewModel = ViewModelProviders.of(this, viewModelFactory).get(
            LoginViewModel::class.java)
    loadData("abc", "xyz")
    observerOnLoginResult()
    observerOnLoginError()
}


private fun observerOnLoginError() {
    loginViewModel.loginError().observe(this, Observer<String> {
        progressBarUtils.cancelProgressDialog()
        if (it != null) {
            Toast.makeText(this, resources.getString(R.string.error_message) + it,
                    Toast.LENGTH_SHORT).show()
        }
    })
}

private fun observerOnLoginResult() {
    loginViewModel.loginResult().observe(this,
            Observer<LoginModel> {
                progressBarUtils.cancelProgressDialog()
                if (it != null) {
                    setData(it)
                }
            })
}

private fun setData(loginData: LoginModel) {
    pref.setCurrentUserName(loginData.data.userName)
}

private fun loadData(email: String, password: String) {
    progressBarUtils.showProgressDialog()
    val builder = StringBuilder()
    var auth = Base64.encodeToString(("$email:$password").toByteArray(), Base64.NO_WRAP)
    builder.append("Basic ")
    builder.append(auth)
    loginViewModel.getLoginData(builder.toString())
}

override fun onDestroy() {
    loginViewModel.disposeElements()
    super.onDestroy()
}

AppModule

@Module class AppModule(val app: Application) {

@Provides
@Singleton
fun provideApplication(): Application = app


@Provides
@Singleton
fun provideSharedPreferences(): AppSharedPreferences = AppSharedPreferences(app)


@Provides
@Singleton
fun provideUtils(): Utils = Utils(app)
}

Модуль Builder

@Module abstract class BuildersModule {

@PerActivity
@ContributesAndroidInjector(modules = arrayOf(LoginModule::class))
abstract fun contributeLoginActivity(): LoginActivity

@PerActivity
abstract fun contributeBaseActivityActivity(): BaseActivity
}

Компонент приложения

@Singleton @Component(
    modules = arrayOf(AndroidInjectionModule::class, AppModule::class, BuildersModule::class))

interface AppComponent { 
  fun inject(app: LotusApp)            
}

1 Ответ

0 голосов
/ 29 мая 2018

Вы не можете использовать объект до его инициализации.

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState) // prefs called in parents onCreate!
  setContentView(R.layout.activity_login)
  AndroidInjection.inject(this) // injection happens here

Приведите свои звонки в порядок.Самый простой способ исправить это - переместить AndroidInjection.inject(this) до вызова super.onCreate(...).

.
...