return shellMainViewModel
}

override fun initView() {
    //初始化fragment
    val shellMainViewPager2Adapter = ShellMainAdapter(this
        , arrayListOf(mShellMainFragment
            ,mShellMainPluginFragment
            ,mShellMainSettingFragment))
    shellMainViewPager2.adapter = shellMainViewPager2Adapter
    ViewPager2Delegate.install(shellMainViewPager2,shellMainTabLayout)
}

override fun initData() {
    //对共享fragment里的值进行观察,同时弹出toast
    sharedViewModel.testLiveData.observe(this,{
        Toast.makeText(this, "$it", Toast.LENGTH_SHORT).show()
    })
}

override fun startObserve() {

}
//分别添加3个子fragment
inner class ShellMainAdapter(activity: FragmentActivity, private val fragmentList: List<Fragment>)
    : FragmentStateAdapter(activity){

    override fun getItemCount(): Int {
        return fragmentList.size
    }

    override fun createFragment(position: Int): Fragment {
        return fragmentList[position]
    }

}

}
复制代码

看一下共享ViewModel代码:

@HiltViewModel
class ShellMainSharedViewModel @Inject constructor() : BaseViewModel() {

val testLiveData = MutableLiveData<String>("00")

fun setValue(view: View){
    val random = (1 .. 100).random().toString()
    Log.i(TAG, "setValue: 随机数 $random")
    testLiveData.value = random
}

}
复制代码

这里非常简单,就是一个LiveData,然后接着看一下Fragment,


这里的注意点是Fragment自己的ViewModel使用viewModels来获取,对于要和整个activity生命周期共享的ViewModel使用activityViewModels来获取:

@AndroidEntryPoint
class ShellMainFragment : BaseVMFragment() {

private val shellMainFragmentViewModel: ShellMainFragmentViewModel by viewModels()
//获取共享ViewModel
private val shellMainSharedViewModel: ShellMainSharedViewModel by activityViewModels()

override fun getLayoutResId(): Int = R.layout.fragment_shell_main

override fun initVM(): ShellMainFragmentViewModel {
    return shellMainFragmentViewModel
}
//依次绑定2个viewModel
override fun initView() {
    mBinding.setVariable(BR.sharedViewModel,shellMainSharedViewModel)
    mBinding.setVariable(BR.viewModel,shellMainFragmentViewModel)
}

override fun initData() {
}

override fun startObserve() {
}

}
复制代码

然后在xml中,有一个textView控件可以显示viewModel中的值,以及修改值:

<?xml version="1.0" encoding="utf-8"?>

<data>

    <variable
        name="viewModel"
        type="com.wayeal.yunapp.shell.mvvm.main.ShellMainFragmentViewModel" />

    <variable
        name="sharedViewModel"
        type="com.wayeal.yunapp.shell.mvvm.main.ShellMainSharedViewModel" />

</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".shell.mvvm.main.ShellMainFragment"
    android:orientation="vertical"
    >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="首页" />

    <TextView
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{sharedViewModel.testLiveData}"
        android:textSize="20sp"
        android:textColor="@color/black"
        />