这是一个与LiveData有关的bug吗?



我已经隔离了显示这个问题的代码。

我在一个片段中有一个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住第二个朋友">

最新更新