2017-08-05 37 views
0

我是Kotlin的新手。我有一個我選擇轉換爲kotlin的android項目。這是我的一段代碼。智能投向BootsrapButton是不可能的,因爲endtrip是此時已更改的可變屬性

import com.beardedhen.androidbootstrap.BootstrapButton 
class EndTrip : AppCompatActivity(){ 
internal var endtrip: BootstrapButton ?= null 

override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_end_trip) 
endtrip.setOnClickListener(View.OnClickListener { 
//Some code here 
} 
} 
} 

但我得到這個錯誤在endtrip

智能投地BootsrapButton是不可能的,因爲endtrip是可變的已經到這個時候

類似的問題已經改變 財產回答here,但我無法找出解決方案。我正在使用beardedhen Android Bootstrap Library。謝謝。

回答

3

錯誤告訴你,你不能保證endtrip是不是在該行的代碼無效。原因是endtripvar。即使您在使用該變量之前執行空檢查,它也可以由其他線程進行變異。

這裏是official document's解釋:

注意,當編譯器不能保證變量不能檢查和使用之間更改智能石膏不起作用。更具體地講,智能管型根據以下規則適用:

  • VAL局部變量 - 始終;
  • val屬性 - 如果該屬性是私有的或內部的,或者檢查在聲明該屬性的同一模塊中執行。智能轉換不適用於打開屬性或具有自定義獲取者的屬性;
  • var局部變量 - 如果變量未在檢查和用法之間修改,並且未在修改它的lambda中捕獲;
  • var properties - never(因爲變量可以隨時由其他代碼修改)。

最簡單的解決方案是使用安全調用操作?.

endtrip?.setOnClickListener(View.OnClickListener { 
    //Some code here 
} 

推薦閱讀:In Kotlin, what is the idiomatic way to deal with nullable values, referencing or converting them

0

val是靜態的,var是可變的。科特林更喜歡在你稱之爲靜態的地方更加靜態。

只是爲了澄清一點,Kotlin只是真的很喜歡你在一個方法中使用var,它不喜歡它在主要。它希望在那裏。

val是一個不可變的變量 var是可變的。

+0

因此,這是該解決方案的好友@Xype –

+0

我會嘗試從內部VAR改變它內部val,看看它是否工作。 Kotlin遇到了問題,我也正在經歷它,這是一場試火,有限的文檔,不斷變化。雖然有趣。 – Xype

0

我已經找到了問題。我刪除了endtrip的全局聲明,並在onCreate方法中初始化它,如下所示。

import com.beardedhen.androidbootstrap.BootstrapButton 
class EndTrip : AppCompatActivity(){ 

override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_end_trip) 
var endtrip: BootstrapButton = findViewById(R.id.endtrip) as BootstrapButton 
endtrip.setOnClickListener(View.OnClickListener { 
//Some code here 
} 
} 
} 

但我擔心的是如果我想在其他方法中使用變量?

0

您收到該錯誤的原因是由於智能鑄造和使用varvar是可變的,所以在你的代碼中的任何一點,它都可以改變。 Kotlin不能保證,endtrip將被更改爲的值可以被鑄造爲BootstrapButton從而出錯。在智能轉換下的文檔中,它列出了智能轉換無法實現時的各種實例。你可以找到它們here

爲了讓你的代碼工作,你必須把它改成這樣

val endtrip: BootstrapButton ?= null 

有了這個,科特林是放心,您的endtrip變量不會改變,能夠成功地轉換爲BootstrapButton。

編輯:既然你要重新分配endtrip,你可以做這樣的事情:

var endtrip: BootstrapButton ?= null 
val immutableEndtrip = endtrip // you can definitely use a different variable name 

if(immutableEndtrip !=null) 
{ 
endtrip = findViewById(R.id.endtrip) as BootstrapButton 
} 
+0

感謝您的回覆。但是,當我這樣做,我得到一個錯誤val不能重新分配在endtrip = findViewById(R.id.endtrip)作爲BootstrapButton –

+0

回答更新。 –

相關問題