Как исправить нулевой указатель для «респ», наблюдая за значением живых данных - PullRequest
2 голосов
/ 30 марта 2019

Мой код отлично работает с моделью представления, но когда я начинаю наблюдать значение, используя текущие данные в

model.d.observe(this, Observer<RespCategories> {
                r->resp=r
})

тип r в resp=r изменен с RespCategories на RespCategories? и он не соответствует параметрам адаптера пейджера, поэтому я внес в него некоторые изменения, например, преобразовал var resp: RespCategories в var resp: RespCategories? = null, поэтому возникла новая проблема, когда наблюдалось, что значение r->resp=r соответственно равно нулю. Как решить проблему?

kotlin.KotlinNullPointerException   at com.example.xyz.MainActivity.showData(MainActivity.kt:83)
                      at com.example.xyz.MainActivity$fetchData$1.onResponse(MainActivity.kt:65)

MainActivity

class MainActivity : AppCompatActivity()
 {

    var userService: UserService = ApiUtils.getUserService()
    var dotscount: Int = 0
    lateinit var sliderDotspanel: LinearLayout
    lateinit var sectionPagerAdapter: SectionPagerAdapter
    lateinit var respCategories: RespCategories
    var resp: RespCategories? = null

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

        sliderDotspanel = findViewById(R.id.sliderdots)
        fetchData()


    }


    fun fetchData() {

        var call: Call<RespCategories>

        call = userService.getData()

        call.enqueue(object : Callback<RespCategories> {
            override fun onFailure(call: Call<RespCategories>, t: Throwable) {
                Toast.makeText(this@MainActivity, "fail", Toast.LENGTH_LONG).show()
            }

            override fun onResponse(call: Call<RespCategories>, response: Response<RespCategories>) {
                Toast.makeText(this@MainActivity, "success", Toast.LENGTH_LONG).show()
                respCategories = response.body()!!
                var dataGenerator:DataGenerator
                dataGenerator=DataGenerator()
                dataGenerator.addData(respCategories)
              //  DataGenerator.addData(respCategories)
                showData()
            }

        })

    }

    fun showData(){

        //var resp:RespCategories=DataGenerator.getData()
        val model=ViewModelProviders.of(this).get(DataGenerator::class.java)
       // var resp=model.getData()

        model.d.observe(this, Observer<RespCategories> {
                r->resp=r
        })

        if (viewPager != null) {

            sectionPagerAdapter = SectionPagerAdapter(supportFragmentManager, resp)
            viewPager.adapter = sectionPagerAdapter

            dotscount = sectionPagerAdapter.getCount()
            var dots: Array<ImageView?>? = null
            dots = arrayOfNulls(dotscount)

            for (i in 0 until dotscount) {
                dots[i] = ImageView(this@MainActivity)
                dots[i]!!.setImageDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.non_active_dots))

                val params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
                params.setMargins(8, 0, 8, 0)
                sliderDotspanel.addView(dots[i], params)
            }

            dots[0]!!.setImageDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.active_dots))
            viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {

                }

                override fun onPageSelected(position: Int) {
                    for (i in 0 until dotscount) {
                        dots[i]!!.setImageDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.non_active_dots))

                    }

                    dots[position]!!.setImageDrawable(ContextCompat.getDrawable(applicationContext, R.drawable.active_dots))

                }

                override fun onPageScrollStateChanged(state: Int) {

                }
            })
        }

    }
}
>Datagenerator
````````````
class DataGenerator constructor(): ViewModel() {

    companion object {
       // lateinit var da:RespCategories
    //   lateinit var da:MutableLiveData<RespCategories>
    }

            val d=MutableLiveData<RespCategories>()

    fun addData(respCategories: RespCategories){
       // d=respCategories
        d.value=respCategories

    }
    fun getData():MutableLiveData<RespCategories>{
        return d
    }
}
>RespCategories
````````````
data class RespCategories constructor(

    @field:SerializedName("type")
    val type: String? = null,

    @field:SerializedName("value")
    val value: List<String?>? = null


)

  [1]: https://i.stack.imgur.com/eDAhx.png

1 Ответ

0 голосов
/ 30 марта 2019

В вашем коде есть ошибка: ваш наблюдатель в showData() наблюдает за одним DataGenerator объектом, но onResponse() выполняет обратный вызов и отправляет данные другому.Вы должны

Несколько слов о параметрах типа, допускающих обнуление LiveData.Посмотрите на интерфейс Observer:

public interface Observer<T> {
    void onChanged(@Nullable T t);
}

параметр метода onChanged() помечен @Nullable.Этот метод наблюдает обнуляемый тип в зависимости от обнуляемости параметра типа LiveData.Даже если ваш LiveData определен с параметром ненулевого типа, вы можете ожидать null:

  • , если вы вызываете liveData.value для нового объекта, но вы можете переопределить значение по умолчанию NULL и установить свойпринадлежат

    val d = MutableLiveData<RespCategories>().apply { value = RespCategories.DEFAULT }
    
  • если ваш код java содержит нулевое значение (это не запрещено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...