ViewModelProviders не работает внутри моего фрагмента - PullRequest
0 голосов
/ 28 июня 2019

Это то, что я пытаюсь сделать.

  • Установите ArrayList объекта внутри фрагмента
  • Получить этот массив от наблюдателя в пределах FragmentActivity контейнер (действие, в котором размещены все фрагменты)

Итак, то, что я сделал, это следующее.

Сначала я создал SharedViewModel, из которого я буду устанавливать и получать данные:

SharedViewModel.kt

class SharedViewModel: ViewModel() {

    var personArrayObj:MutableLiveData<ArrayList<Person>> = MutableLiveData()

    fun setPersonArray(personArray:ArrayList<Person>){
        personArrayObj.value = personArray
    }

    val getPersonArray:LiveData<ArrayList<Person>>
    get() = personArrayObj

}

Теперь я создаю экземпляр ViewModel внутри MainActivity, в котором находятся все созданные фрагменты, поэтому я могу получить ArrayData из любого фрагмента его набора:

MainActivity.kt

class MainActivity: FragmentActivity(){

private lateinit var viewModel:SharedViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        viewModel = ViewModelProviders.of(this).get(SharedViewModel::class.java)
        viewModel.getPersonArray.observe(this, Observer { it:ArrayList<Person>
            Log.d("Array:",""+it)
        })
    }

}

Тогда последнее, что мне нужно сделать, это установить значение этого массива из любого фрагмента, который я хочу, и тогда действие узла будет запущено, если значение изменилось, поэтому для этого я просто делаю viewModel.setValue(personArray) по моему желанию фрагмент .

Проблема

Когда я пытаюсь создать экземпляр SharedViewModel внутри любого фрагмента, я получаю эту проблему:

enter image description here

Я пытался утверждать !! для нуля, используйте пусть тоже, но не работает, и мне интересно, откуда FragmentActivity требуется

Если я использую viewLifecycleOwner вместо activity, он говорит мне, что он не может быть вызван с Fragment или FragmentActivity ?

Есть какие-нибудь подсказки?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 28 июня 2019

Фрагменты предлагают вспомогательный метод для получения ненулевого действия - requireActivity(). Используйте это вместо activity:

viewModel = ViewModelProviders.of(requireActivity()).get(SharedViewModel::class.java)

В качестве альтернативы вы можете включить в свое приложение зависимость fragment-ktx и использовать расширение by activityViewModels () вместо свойства ViewModelProviders.of() вообще:

val viewModel: SharedViewModel by activityViewModels()
0 голосов
/ 28 июня 2019

Хорошо, я не видел это

Я делал экземпляр viewModel внутри моего Фрагмента , а другой - внутри моей MainActivity , поэтому мы мешаем наблюдателю работать.

Чтобы решить эту проблему, я просто создал простой метод, который возвращает экземпляр, который я создал внутри моего MainActivity

 fun getViewModelInstance():SharedViewModel = viewModel

Тогда я просто вызываю этот экземпляр из любого фрагмента для работы с ним

(activity as MainActivity).getViewModelInstance().setPersonArray(personArray)
0 голосов
/ 28 июня 2019

По сути, проблема в том, что внутри вашего класса фрагмента контекст активности будет обнуляемым и ViewModelPorviders требует ненулевой контекст для работы.

Одним из решений было бы сделать ваш ViewModel объект обнуляемым (потому что ваша деятельность обнуляема) внутри вашего фрагмента, как показано ниже:

var viewModel: SharedViewModel? = null

затем при инициализации

viewModel = activity?.let { ViewModelProviders.of(it).get(SharedViewModel::class.java) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...