android在不使用getActivity()的情况下在两个片段之间实现ViewModel



我的应用程序中有两个片段。当用户点击第一个片段中的按钮时,会添加第二个片段,这样用户就可以插入一些数据。然后它被关闭并将插入的数据返回给第一个片段。我使用ViewModels进行片段之间的通信。

collectionsEditedViewModel = new ViewModelProvider(getActivity()).get(CollectionsEditedViewModel.class);
collectionsEditedViewModel.isEdited().observe(getViewLifecycleOwner(), new Observer<Bundle>() {
@Override
public void onChanged(Bundle bundle) {
}
});

通信工作正常。但问题是,我如何在片段中定义这种通信的范围。目前,我使用getActivity()作为ViewmodelStoreOwner,这使得无论何时重新打开第一个片段,都会将集合数据重新传递到第一个片段。我该如何解决这个问题?

我相信,对于碎片之间的通信,通过"活动"是可行的,所以您走的是正确的路径。

你可以做的一件事是使用SingleLiveData类,它本质上类似于LiveData,但在设置了它的值后,它就无效了,所以只有第一个观察者才能得到它:

class SingleLiveData<T> : MutableLiveData<T>() {
private val mPending = AtomicBoolean(false)
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
// Observe the internal MutableLiveData
super.observe(owner, Observer { t ->
if (mPending.compareAndSet(true, false)) {
observer.onChanged(t)
}
})
}
@MainThread
override fun setValue(t: T?) {
mPending.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
value = null
}
companion object {
private val TAG = "SingleLiveData"
}
}

然后您可以简单地拨打:singleLiveData.call()为"设置并销毁",因此,第一次使用后忘记您的价值!从以下位置检索的类(多年来一直在我的项目中使用(:https://stackoverflow.com/a/46862551/

最新更新