ViewModel 在 Activity 中设置数据并在 Fragment 中使用

ViewModel set data in Activity and use in Fragment

我正在尝试不实现 ViewModel,请帮助我解决这个问题。我希望在 Activity 中设置数据并在 Fragment

中使用它

主要Activity:

class MainActivity : AppCompatActivity(),ListFragment.OnFragmentInteractionListener {

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


        var viewModel = ViewModelProvider.NewInstanceFactory().create(TapupuViewModel::class.java)
        viewModel.setData(movieList)
    }
    }

视图模型:

class TapupuViewModel : ViewModel() {

    val message  = MutableLiveData<ArrayList<Movie>>()

    fun setData(msg:ArrayList<Movie>){
        message.setValue(msg)
    }
}

片段:

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.fragment_list2, container, false)

        val model = ViewModelProvider(activity!!).get(TapupuViewModel::class.java)
        model.message.observe(viewLifecycleOwner, Observer {
            it?.let {
                moviesArrayList = it

            }
        })
        }

我可能在那里做错了什么。你能帮帮我吗?

View <---> ViewModel <---> Repository <---> Room Dao

观点是:Fragment/Activity

不需要 在您的 Activity 和 Fragment 之间共享任何 ViewModel 或...。

class MyRepository {
    private val dao: YourDao = ...

    fun getModelFromLocal(): LiveData/RxJava/List<Model> = dao.getModel()
}

在您的 ViewModel 中

private val repository: MyRepository  = ...
val resultLiveData = MutableLiveData<SomeModelToShowOnUI>()

fun onUISentEventToLoadData() {
    val data: SomeModelToShowOnUI = repository.getModelFromLocal()
    resultLiveData.value = data
}

Activity/Fragment 观察 ViewModel 的变化:

class MyFragment : Fragment() {
    override fun onViewCreated() {
        resultLiveData.observe(this, Observer {
            //update UI
        })
    }
}

每个 Fragment/Activity 都有自己的实现。