首页 > 解决方案 > 片段不通过 sharedViewModel 和 LiveData 进行通信

问题描述

我希望第一个片段通过来自第二个片段的 LiveData 观察信息。我尝试做同样的事情,但只在 1 个 Fragment 中工作,但只要我想接收其他片段中的数据,它就会停止工作(textView 没有文本)。我应该如何解决这个问题?

共享视图模型:

class SharedViewModel : ViewModel() {
    private val selected : MutableLiveData<Person> = MutableLiveData<Person>()

    fun select(person: Person){
        selected.value = person
    }

    fun getSelected(): LiveData<Person>{
        return selected
    }
}

第一个片段:

class FirstFragment : Fragment() {

    private lateinit var sharedViewModel: SharedViewModel
    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        sharedViewModel =
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        val root = inflater.inflate(R.layout.fragment_home, container, false)
        val textView: TextView = root.findViewById(R.id.text_home)

        sharedViewModel.getSelected().observe(viewLifecycleOwner, Observer{
            textView.text = it.name
        })
        return root
    }
}

第二个片段:

class SecondFragment : Fragment() {

    private lateinit var sharedViewModel: SharedViewModel

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        sharedViewModel =
            ViewModelProviders.of(this).get(SharedViewModel::class.java)
        val root = inflater.inflate(R.layout.fragment_dashboard, container, false)
        val textView: TextView = root.findViewById(R.id.text_dashboard)

        val person = Person("John")
        val newPerson = Person("Anton")

        val button2: Button = root.findViewById(R.id.button2)
        val button: Button = root.findViewById(R.id.button)

        button2.setOnClickListener {
            sharedViewModel.select(person)
        }

        button.setOnClickListener {
            sharedViewModel.select(newPerson)
        }
        return root
    }
}

班级人:

class Person (var name: String) {
}

标签: androidandroid-fragmentskotlinandroid-livedata

解决方案



推荐阅读