Android studio 如何在kotlin中初始化lateinit变量?
我希望在此活动中从数据类cartDocs获取“id”。 我试图运行此代码,但出现如下错误: kotlin.UninitializedPropertyAccessException:lateinit属性购物车尚未初始化 我还尝试删除数据类中的“?”。但还是一样的问题。 我怎样才能解决这个问题Android studio 如何在kotlin中初始化lateinit变量?,android-studio,kotlin,retrofit,Android Studio,Kotlin,Retrofit,我希望在此活动中从数据类cartDocs获取“id”。 我试图运行此代码,但出现如下错误: kotlin.UninitializedPropertyAccessException:lateinit属性购物车尚未初始化 我还尝试删除数据类中的“?”。但还是一样的问题。 我怎样才能解决这个问题 class CartViewActivity : AppCompatActivity(), SwipeRefreshLayout.OnRefreshListener { lateinit va
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) {
}
})
class CartViewActivity:AppCompatActivity(),SwipeRefreshLayout.OnRefreshListener{
lateinit var cart:cartDocs
@RequiresApi(Build.VERSION\u code.N)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u cart\u视图)
val token=SharedReference.getTokenInfo(此)
Client.service.getCart(令牌).enqueue(对象:回调{
覆盖fun onResponse(调用:调用,响应:响应){
swipeRefreshLo.setOnRefreshListener(this@CartViewActivity)
showdata(response.body()?.docs!!)
val itemId=cart.id
if(itemId!=null){
setCartId(applicationContext,itemId)
}
}
覆盖失效时的乐趣(调用:调用,t:可丢弃){
}
})
数据类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
)
数据类cartDocs(
变量id:字符串?=null,
变量标题:字符串?=null,
var股票:Int?=null,
var availableAfter:字符串?=null,
var价格:Int?=null,
变量点:Int?=null,
var mainImage:字符串?=null,
变量说明:可变列表,
变量金额:Int?=null,
添加的变量:字符串?=null,
变量选项:可变列表,
var单价:Int?=null,
变量单位点:Int?=null,
var totalPrice:Int?=null,
var totalPoint:Int?=null
)
lateinit
是为在对象创建后需要初始化变量的情况而设计的,例如像dagger
这样的框架。事实上,它允许将lateinit
变量用作正常的非null
值(并去掉不必要的?/!!
运算符)但是程序员有责任确保在使用之前初始化该值
在你的例子中,你试图在初始化变量之前使用它。因此,你得到了一个异常。你需要的是在某个时刻初始化该值。但是,我会考虑设计-似乎你需要的是一个null
类型,在这里使用lateinit
是不合理的。它会强制你检查值是否为空在使用该值之前不为null
如果您对JVM中的
lateinit
设计感兴趣,您可以看到我对其他问题的旧答案:它是未初始化的cart
。可空类型(?
)不会生成此错误。那么如何通过分配给它来初始化cart呢。cart=cartDocs()
@RequiresApi(Build.VERSION\u CODES.N)
应该已经引起怀疑了。。。