TextView активности является нулевым - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь создать приложение для проверки погоды, используя OpenWeatherMap, Kotlin, Retrofit и MVP с чистой архитектурой .

.Приложение очень простое, имеет только одно действие, а макет показывает разные данные в зависимости от местоположения, которое выбирает пользователь.При инициировании действия это инициализирует докладчика в onCreate и вызывает метод, который инициирует процесс запроса.Когда я возвращаюсь к своей деятельности с ответом, я пытаюсь показать некоторую информацию об этом ответе в TextView, но приложение вылетает, потому что это представление null.

Я использую Kotlin Android Extensions, что позволяет мне теоретически вызывать представление только с его идентификатором, без необходимости использования findViewById.

Я новичок в Kotlin и, может быть, мне чего-то не хватает.

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import com.climaconsulta.R
import com.climaconsulta.user.model.pojos.MainWeather
import com.climaconsulta.user.presenter.MainActivityPresenter
import com.climaconsulta.user.presenter.MainActivityPresenterImpl
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity(), MainActivityView {
    var presenter: MainActivityPresenter? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        presenter = MainActivityPresenterImpl()
        presenter!!.getMainWeather("London")
    }

    override fun showCurrentCity() {
        presenter!!.getCurrentCity()
    }

    override fun showMainWeather(mainWeather: MainWeather) {
        mainTemperature.text = mainWeather.main!!.temp.toString()
        // HERE I TRY TO SET THE TEXT. BUT "mainTemperature" IS NULL
    }

    override fun showFiveDaysWeather(cityName: String) {
        presenter!!.getFiveDaysWheather(cityName)
    }

    override fun showError(error: String) {
        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
    }
}

1 Ответ

0 голосов
/ 11 февраля 2019

Во-первых, почему вы заставляете обнуляемый тип запускаться самостоятельно?Почему вы не называете это безопасным способом, как это presenter?.func()? Принудительный вызов вызовет сбой вашего приложения, но безопасный вызов - нет.

Во-вторых, переместите эти строки ниже в onStart()

presenter = MainActivityPresenterImpl()
presenter?.getMainWeather("London")

Я бы хотел порекомендовать вам использовать в интерфейсе Presenter MainActivityView, который реализует вашу MainActivity.Я не вижу, когда вы установите его в presenter.

Пример ->

BasePresenter:

abstract class BasePresenter<View : BaseView> {
    protected var view: View? = null

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

    open fun detachView(view: View) {
        if (this.view == view) {
            this.view = null
        }
    }
}

interface BaseView {
    fun showError(error: String)
}

Presenter:

class MainPresenter() : BasePresenter<MainActivityView>() {
    private fun getMainWeather(name: String) {
        view?.showProgress(true)
        ...
    }
}

MainActivity:

@Inject
protected lateinit var presenter: MainPresenter
...

override fun onStart() {
    super.onStart()
    presenter.attachView(this)
}

override fun onStop() {
    presenter.detachView(this)
    super.onStop()
}

И да, я использую Dagger 2 для предоставления зависимостей.Вы можете использовать это как мне грустно:

presenter = MainActivityPresenterImpl()
presenter?.getMainWeather("London")

Но если вы хотите, вы можете взглянуть на простую реализацию Dagger 2 для небольшого проекта.

...