проблема с межфрагментным взаимодействием с использованием viewModel - PullRequest
0 голосов
/ 08 мая 2020

Я новичок в разработке Kotlin и android, но не могу понять, почему моя программа не работает. Я пытаюсь передать свой первый фрагмент его ребенку и проверяю его с помощью строки, но она не отображается. Заранее спасибо за вашу помощь !!! Мой первый фрагмент:

class FirstFragment : Fragment() {

    private lateinit var viewModel : Communicator

    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_first, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel = activity?.run {
            ViewModelProvider(this).get(Communicator::class.java) // .of supprimé
        } ?: throw Exception("Invalid Activity")
        viewModel.message.value = "test"
        view.findViewById<Button>(R.id.button_stall_selection).setOnClickListener {
            findNavController().navigate(R.id.action_FirstFragment_to_SecondFragment)
        }
    }
}

Вот мой второй:

class SecondFragment() : Fragment() {

    private lateinit var viewModel :Communicator
    private var msg: String? = ""
    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_second, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel = activity?.run {
            ViewModelProvider(this).get(Communicator::class.java) // .of deleted
        } ?: throw Exception("Invalid Activity")

        viewModel.message.observe(viewLifecycleOwner, Observer {
            msg = viewModel.message.value
        })

        view.findViewById<TextView>(R.id.textView_1).text = msg
        view.findViewById<Button>(R.id.button_second).setOnClickListener {
            findNavController().navigate(R.id.action_SecondFragment_to_FirstFragment)
        }
    }
}

и, наконец, вот класс viewModel, который я пытаюсь использовать для общения:

import  androidx.lifecycle.MutableLiveData
import  androidx.lifecycle.ViewModel

class Communicator() : ViewModel(){

    val message =MutableLiveData<String>()

    fun setMsgCommunicator(msg:String){
        message.setValue(msg)
    }
}

1 Ответ

0 голосов
/ 08 мая 2020

В вашем FirstFragment попробуйте вызвать viewModel.setMsgCommunicator("test") вместо прямого вызова viewModel.message.value = "test"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...