на kotlin текстовое представление не инициализируется вне метода onCreate

Я новичок в Kotlin и пытаюсь внедрить архитектуру MVP.

В настоящее время у меня возникла проблема с инициализацией/установкой значения textview вне метода onCreate(), вот мой код

SplashActivity.kt

class SplashActivity : AppCompatActivity(), Splash.ViewInterface {
lateinit var appDetail: AppDetail
lateinit var textTitle: TextView

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

    textTitle = findViewById(R.id.splash_txt_title) as TextView

    AppSingleton.appContext = applicationContext

    var splashPresentation = SplashPresentation(this)
    splashPresentation.getAppDetailFromService()
}

override fun fetchAppDetailSuccessful(response: SplashServiceObject) {
    AppSingleton.initializeAppDetal(Gson().fromJson(response.json_string, AppDetail::class.java))
    this.appDetail = AppSingleton.appDetail
}

override fun fetchAppDetailFailed(errMsg: String) {
    textTitle.text = errMsg
}
}

SplashPresenter.kt

class SplashPresentation(private val view: Splash.ViewInterface) : Splash.PresentationInterface {

fun getAppDetailFromService() {
    var splashService = SplashService()
    splashService.getAppDetailFromAssets(this)
}

override fun fetchAppDetailFromServiceSuccessful(response: SplashServiceObject) {
    view.fetchAppDetailSuccessful(response)
}

override fun fetchAppDetailFromServiceFailed(errMsg: String) {
    view.fetchAppDetailFailed(errMsg)
}
}

SplashService.kt

 class SplashService {
fun getAppDetailFromAssets(splashPresentation: SplashPresentation) {
    val json_filename = "appdetail.json"
    var jsonResponse: JsonResponse = AppSingleton.commonUtils.fetchJsonFromAssets(json_filename, AppSingleton.appContext!!)
    if (jsonResponse.json_status) {
        var splashServiceObj = SplashServiceObject
        splashServiceObj.json_string = jsonResponse.json_info
        splashServiceObj.response_msg = "JSON Successful fetched."
        splashPresentation.fetchAppDetailFromServiceSuccessful(splashServiceObj)
    } else {
        splashPresentation.fetchAppDetailFromServiceFailed(jsonResponse.json_info)
    }
}
}

в моем SplashActivity().onCreate() я вызываю Presenter, который обращается к Сервису, затем Сервис возвращает значение Presenter,
Затем Presenter возвращает значение в представление моего SplashActivity, одна из функций, fetchAppDetailFailed(errMsg)

когда я запускаю приложение, оно вылетает, говоря, что «textaa» еще не инициализирован.
Вернувшись в Java exp, когда экземпляр переменной уже создан в onCreate(), вы можете вызывать эту переменную в любом месте действия.

Заранее спасибо!


person MaChee Neraid    schedule 26.02.2020    source источник
comment
Здравствуйте, @Machee Neraid, пожалуйста, пришлите мне код службы и ведущего.   -  person Anand Diamond    schedule 26.02.2020
comment
@AnandDiamond, я обновил свой вопрос с ведущим и сервисом. Спасибо!   -  person MaChee Neraid    schedule 26.02.2020


Ответы (1)


Вы не можете создавать экземпляры Activity на Android. Они создаются ОС, и ОС вызывает для них методы жизненного цикла.

В шаблоне MVP View и Presenter ссылаются друг на друга. Поскольку Activity (представление) является точкой входа приложения, ваша Activity должна создавать экземпляр Presenter и передавать ссылку на себя Presenter, чтобы общение могло идти в обоих направлениях.

Кроме того, ссылка на действие в Presenter должна быть указана как ViewInterface, а не как действие, иначе вы как бы побеждаете цель использования MVP.

class SplashPresentation(private val view: Splash.ViewInterface) : Splash.PresentationInterface {

    //... methods that call functions on view
}

class SplashActivity : AppCompatActivity(), Splash.ViewInterface {

    private val presenter = SplashPresentation(this)

    //...

}
person Tenfour04    schedule 26.02.2020
comment
Большое спасибо! Оно работает! Добавив SplashPresentation(private val view: Splash.ViewInterface) вместо Context, теперь он работает! Спасибо! - person MaChee Neraid; 26.02.2020
comment
Кстати, вы не против проверить мой общий код? если есть вопросы или проблемы? это будет большим подспорьем для новичка, как я! еще раз спасибо! - person MaChee Neraid; 26.02.2020
comment
Вы можете опубликовать его на codereview.stackexchange.com, так как нецелесообразно рассматривать его здесь, в комментариях. Они вроде как требуют, чтобы ваш код действительно работал, прежде чем публиковать там, потому что это не для отладки, а только для критики дизайна и тому подобного. - person Tenfour04; 26.02.2020