kotlin, текстовое представление не инициализировано вне метода onCreate - PullRequest
0 голосов
/ 26 февраля 2020

Я новичок в 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 вернет значение в View моего SplashActivity, одна из функций будет fetchAppDetailFailed (errMsg)

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

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

1 Ответ

2 голосов
/ 26 февраля 2020

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

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

Кроме того, ссылка на активность в Presenter должна быть указана как ViewInterface, а не как Activity, или вы как-то отрицаете цель использования 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)

    //...

}
...