Фрагменты не общаются через sharedViewModel и LiveData - PullRequest
0 голосов
/ 23 февраля 2020

Я хочу, чтобы первый фрагмент наблюдал информацию через LiveData, поступающую из второго фрагмента. Я попытался сделать то же самое, но только в 1 фрагменте, и это сработало, но как только я хочу получить данные в другом фрагменте, оно перестает работать (textView не имеет текста). Как мне решить эту проблему?

SharedViewModel:

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
    }
}

Класс Person :

class Person (var name: String) {
}

1 Ответ

1 голос
/ 23 февраля 2020

Я думаю, что вы используете https://developer.android.com/reference/android/arch/lifecycle/ViewModelProviders#of (android .support.v4.app.Fragment) , но вместо этого вы должны использовать https://developer.android.com/reference/android/arch/lifecycle/ViewModelProviders#of (android .support.v4 .app.FragmentActivity) . Вот как работает обмен.

...