LiveData 未观察具有共享视图模型的子 viewpager 片段

LiveData is not observing on child viewpager fragments having a shared viewmodel

LiveData 未观察子 viewpager 片段,其中子片段有一个共享视图模型来访问数据。

这里的 FragmentA 和 FragmentB 是一个 viewpager 的一部分,它们共享一个 viemodel SharedViewModel。

public class SharedViewModel extends AndroidViewModel { //in Java

    private final MutableLiveData<Data> mLiveData = new MutableLiveData<>();
    public LiveData<Data> getLiveData() {
        return mLiveData;
    }

    //for updating data through LiveData, using post as and when I get the response from DataSource as shown below.

    mLiveData.postValue(response); //getting the response on debugging
}
class FragmentA : Fragment()  { //in Kotlin

    override fun onCreate(@Nullable savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mViewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        ....

        mViewModel.liveData.observe(viewLifecycleOwner, {
            //no call coming in this block so unable to update view
        })
    }
}
class FragmentB : Fragment()  { //in Kotlin

    override fun onCreate(@Nullable savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        mViewModel = ViewModelProvider(this).get(SharedViewModel::class.java)
    }
}

需要一些帮助来了解为什么实时数据无法观察到变化。

提前致谢。

您的 ViewModel 未共享。您已将其命名为 sharedViewmodel,但是通过传递 Unique Owner 获取它的实例的方式也将是一个 unique 实例

共享视图模型的正确方法是

class SharedViewModel : ViewModel() {
    private val myLiveData = MutableLiveData<Data>()

    fun getMyLiveDta():LiveData {
      return myLiveData
    }
}

现在在第一个片段中

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    // Get instance of viewmodel in fragment like this
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
    }
}

在第二个片段中是这样的

class DetailFragment : Fragment() {

    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
            // Update the UI
        })
    }
}