我已经隔离了显示这个问题的代码。
我在一个片段中有一个recyclerview。我也有LiveData和mutableelivedata。
在ViewModel。在Kt代码中,按照这个顺序有这两行,它工作得很好:
private val mMLD = MutableLiveData<OneLine>()
var mLD : LiveData<OneLine> = getMLD()
如果我颠倒顺序,即
var mLD : LiveData<OneLine> = getMLD()
private val mMLD = MutableLiveData<OneLine>()
程序崩溃
这是一个bug吗?
我正在使用Android Studio Chipmunk 2021.2.1
下面是我的代码:class Adapter(private var mList: List<OneLine>) : RecyclerView.Adapter<Adapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.one_line, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val DisplayViewModel = mList.get(position)
holder.textView.text = DisplayViewModel.text
}
override fun getItemCount(): Int {
return mList.size
}
class ViewHolder(ItemView: View) : RecyclerView.ViewHolder(ItemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
}
class Fragment : Fragment() {
private lateinit var adapter : Adapter
private lateinit var viewModel: ViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view: View = inflater.inflate(R.layout.fragment, container, false)
viewModel = ViewModelProvider(requireActivity()).get(ViewModel::class.java)
viewModel.Initialize()
enableRecyclerView(view)
viewModel.mLD.observe(viewLifecycleOwner, Observer {
adapter.notifyDataSetChanged()
})
return view
}
fun enableRecyclerView(view:View){
var mRecyclerView: RecyclerView? = null
mRecyclerView = view.findViewById(R.id.recycler_view)
val linearLayoutManager = LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false)
mRecyclerView.layoutManager = linearLayoutManager
adapter = Adapter(viewModel.rvData) // This will pass the ArrayList to our Adapter
mRecyclerView.adapter = adapter
}
}
class MainActivity : AppCompatActivity() {
private lateinit var operator_display: ViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
data class OneLine(val text: String) {
}
class ViewModel : ViewModel(){
var mLD : LiveData<OneLine> = getMLD() // observer watches this variable
private val mMLD = MutableLiveData<OneLine>()
private fun getMLD():MutableLiveData<OneLine>{return mMLD}
var rvData = ArrayList<OneLine>()
fun Initialize(){
rvData.add(OneLine("Item A"))
rvData.add(OneLine("Item B"))
rvData.add(OneLine("Item C"))
}
}
private val _thing = "hi"
val wow = getThing() // _thing already assigned
fun getThing():String { return _thing }
fun main() {
println(wow)
}
> hi
val wow = getThing() // _thing not assigned yet
private val _thing = "hi"
fun getThing():String { return _thing } // called when assigning wow, _thing not assigned yet
fun main() {
println(wow)
}
> null
当你通过函数初始化属性时,你可能会遇到这样的问题,声明顺序很重要,或者编译器不能告诉你变量肯定在某处被初始化了。因此,在这里,你实际上跳过了一个函数,它在变量被赋值之前引用了一个变量
因为它还没有被赋值,所以它处于默认状态,即null。还要注意,即使函数的返回类型是非空的String
,它也是空的——空检查系统在这一点上没有帮助。
你没有发布你的实际错误,但在猜测它运行到那个空,要么崩溃与NullPointerException
当你尝试调用observe
上,或空检查器看到你分配给它的东西,不应该是空的,它要"hold住第二个朋友">