web-dev-qa-db-ja.com

ViewModelProvidersがフラグメント内で機能しない

これは私がやろうとしていることです。

  • フラグメント内にオブジェクトの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)希望のFragmentで。

問題

フラグメント内でSharedViewModelをインスタンス化しようとすると、この問題が発生します。

enter image description here

主張してみました!! nullの場合はletも使用しますが、機能しません。どこから来るのか、FragmentActivityが必要だと思います

viewLifecycleOwnerの代わりにactivityを使用すると、FragmentまたはFragmentActivity

手がかりはありますか?

感謝します。

4
CoffeeBreak

事をonCreateView()ではなくonActivityCreated()に入れてください...これはnullAcable()の問題を解決します...フラグメントのライフサイクルによると、onActivityCreated()はonCreareView()の後にあります...そしてそしてonActivityCreated()の呼び出しでアクティビティが作成されます...したがって、getActivity()は作成されたアクティビティを返します

0
Rohnak Agarwal