web-dev-qa-db-fra.com

ViewModelProviders ne fonctionne pas à l'intérieur de mon fragment

Voilà ce que j'essaie de faire.

  • Définit un ArrayList d'objet à l'intérieur d'un fragment
  • Obtenez ce tableau d'un observateur dans le conteneur FragmentActivity (l'activité qui héberge tous les fragments)

Donc, ce que j'ai fait est le suivant.

J'ai d'abord créé le SharedViewModel d'où je vais définir et obtenir les données de:

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

}

Maintenant, j'instancie ce ViewModel à l'intérieur du MainActivity qui héberge toutes les créations de fragments, ainsi, je peux obtenir le ArrayData de partout où Fragmenter son ensemble:

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

}

Ensuite, la dernière chose que je dois faire est de définir la valeur de ce tableau à partir du fragment que je veux, puis l'activité de l'hôte sera déclenchée si la valeur a changé, donc, pour ce faire, je fais simplement une fonction viewModel.setValue(personArray) à mon désir Fragment .

Le problème

Lorsque j'essaie d'instancier le SharedViewModel à l'intérieur d'un fragment, j'obtiens ce problème:

enter image description here

J'ai essayé d'affirmer !! pour le null, utilisez let aussi, mais ne fonctionne pas et je me demande d'où il vient que FragmentActivity requis

Si j'utilise viewLifecycleOwner au lieu de activity, il me dit qu'il ne peut pas être appelé avec Fragment ou FragmentActivity ?

Des indices?

Merci .

4
CoffeeBreak

Mettez la chose dans onActivityCreated () au lieu de onCreateView () ... Cela résoudra le problème de getActivity () nullable ... Parce que selon le cycle de vie d'un fragment, onActivityCreated () est après onCreareView () ... Et le l'activité est créée à l'appel de onActivityCreated () ... Ainsi, getActivity () renverra l'activité qui vient d'être créée

0
Rohnak Agarwal