我通過Bundle`vm傳遞資料,我清楚地查看了日志中的所有內容,但是當我嘗試在我應該收到它的片段中轉換引數時,null 來了。我無法輸入我可能會丟失它們的時間。
這是我的第一個虛擬機:
fun sendData(it: ConfigurationDto?) {
Log.d("some", "sendData : $it")
if (it != null) {
OnboardingViewModel.newBundle(it)
}
}
這是我的 OnboardingViewModel 的代碼:
companion object {
val Bundle.configuration: ConfigurationDto?
get() = getSerializable("configuration") as? ConfigurationDto
fun newBundle(configuration: ConfigurationDto): Bundle {
Log.d("some", "new Bundle: configuration $configuration")
return Bundle().apply {
putSerializable("configuration", configuration)
}
}
}
在這里我看到配置來了。
當我試圖在片段中獲取我的論點時:
class OnboardingFragment : Fragment(), ViewPager.OnPageChangeListener, View.OnClickListener {
private fun setupViewModel() {
viewModel = ViewModelProvider(this, viewModelFactory).get(OnboardingViewModel::class.java)
lifecycle.addObserver(viewModel)
Log.d("some", "arguments in vm: $arguments")
viewModel.setInitialData(arguments)
我看到引數是空的。
uj5u.com熱心網友回復:
我看到引數是空的。
arguments是Bundle在 a 上設定的Fragment,通常是在您創建它時。就像是:
val fragment = OnboardingFrament().apply {
arguments = Bundle().apply {
// Set values on bundle
}
}
由于您只顯示了與某些隨機 ViewModel 相關的兩條隨機代碼,而不是您創建的位置OnBoardingFragment,因此我只能假設無論您在何處創建它,您都沒有設定arguments,因此它為空。
uj5u.com熱心網友回復:
你的sendData函式什么都不做。它創建一個 Bundle 物件,然后立即將其釋放到垃圾收集器,因為您沒有對它做任何事情。順便說一句,當它不能對 null 做任何有用的事情時,它接受一個可為 null 的引數是很奇怪的。如果一個函式在其引數為空時無用,則它不應接受可為空的引數。否則,呼叫代碼看起來像是在做一些有用的事情,而實際上卻沒有,這只會使除錯變得更加困難,并且更有可能出現錯誤。
此外,您的 ViewModel 知道您的 Fragment 是非常不尋常的。這是 ViewModel 合同的一部分,您不應該將您的活動或片段泄露給他們。LiveData 很特別,因為它可以在適當的時候自動洗掉對觀察者的參考以防止泄漏。
因此,無論您通過讓 ViewModel 觀察您的 Fragment 生命周期來做什么,都可能是一個設計錯誤。您不應該嘗試使用 ViewModel 函式將資料發送到另一個 Fragment。
如果你想將資料從一個 Fragment 發送到另一個 Fragment,那么你應該arguments在實體化 Fragment 實體之后和進行 Fragment 事務之前設定它的屬性。然后,由于框架會根據配置更改的需要自動重新創建 Fragment,當它自動創建該 Fragment 的新實體時,它也會將相同的引數資料傳遞給它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408439.html
標籤:
