Как инициализировать переменную lateinit в kotlin? - PullRequest
0 голосов
/ 09 января 2020

Я хочу получить "id" из класса данных cartDocs в этом действии. Я пытаюсь запустить этот код, но получаю сообщение об ошибке: kotlin .UninitializedPropertyAccessException: корзина свойств lateinit не была инициализирована. Я также пытался удалить "?" в классе данных. но все та же проблема. Как я могу решить эту проблему?

class CartViewActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener {




    lateinit var cart: cartDocs

    @RequiresApi(Build.VERSION_CODES.N)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_cart_view)

        val token = SharedPreference.getTokenInfo(this)

        Client.retrofitService.getCart(token).enqueue(object :Callback<CartResponse> {
            override fun onResponse(call: Call<CartResponse>, response: Response<CartResponse>) {
                swipeRefreshLo.setOnRefreshListener(this@CartViewActivity)
                showdata(response.body()?.docs!!)
                val itemId = cart.id
                if (itemId!=null){
                    SharedPreference.setCartId(applicationContext,itemId)
                }
            }

            override fun onFailure(call: Call<CartResponse>, t: Throwable) {

            }


        })

класс данных cartDocs

data class cartDocs(

    var id:String?=null,

    var title:String?=null,

    var stock:Int?=null,

    var availableAfter:String?=null,

    var price:Int?=null,

    var point:Int?=null,

    var mainImage:String?=null,

    var description:MutableList<cartDescription>,

    var amount:Int?=null,

    var added:String?=null,

    var options:MutableList<cartOptions>,

    var unitPrice:Int?=null,

    var unitPoint:Int?=null,

    var totalPrice:Int?=null,

    var totalPoint:Int?=null
)



1 Ответ

0 голосов
/ 09 января 2020

lateinit был разработан для случаев, когда вам нужно инициировать переменную через некоторое время после создания объекта - например, для таких сред, как dagger. Фактически это позволяет использовать переменную lateinit как обычное значение not null (и избавиться от ненужных ?/!! операторов), но программист несет ответственность за то, чтобы убедиться, что значение инициализируется перед использованием.

В вашем случае вы пытаетесь использовать эту переменную до ее инициализации. Итак, вы получите данное исключение. Вам нужно инициализировать это значение в какой-то момент. Но я бы подумал о дизайне - кажется, что вам нужен тип nullable и использование lateinit здесь нецелесообразно. Он будет принудительно проверять, не является ли значение нулевым, перед любым использованием этого значения.

Если вас интересует lateinit дизайн в JVM, вы можете увидеть мой старый ответ на другой вопрос: Как деинициализировать латинит в Kotlin

...