如何解决进程死亡后恢复共享ViewModel的问题
我到目前为止所拥有的。
订单列表屏幕:显示订单列表。单击订单后,将显示与该订单关联的产品列表。
class OrderListFragment : Fragment() {
//skipped irrelevant code
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
//skipped irrelevant code
recyclerView.adapter = Adapter(orderList) { order ->
//This is called when an item is clicked in the order list.
findNavController()
.navigate(R.id.order_product_graph,ProductListFragment.constructArguments(order))
}
}
}
与所有这些关联的导航图。
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/shopper_nav_graph"
app:startDestination="@id/shopperHomeFragment2">
<fragment
android:id="@+id/orderListFragment"
android:name="com.example.OrderListFragment"
android:label="OrderListFragment"
tools:layout="@layout/order_list_fragment" />
<navigation
android:id="@+id/order_product_graph"
app:startDestination="@id/productListFragment">
<fragment
android:id="@+id/productListFragment"
android:name="com.example.ProductListFragment"
android:label="ProductListFragment"
tools:layout="@layout/item_list_fragment">
</fragment>
<fragment
android:id="@+id/productFragment"
android:name="com.example.ProductFragment"
android:label="ProductFragment"
tools:layout="@layout/item_fragment" />
<fragment
android:id="@+id/PLUProductFragment"
android:name="com.example.PLUProductFragment"
android:label="PLUProductFragment" />
</navigation>
<!-- Skipped irrelevant code-->
</navigation>
产品列表屏幕:显示与订单关联的产品列表。在参数包中使用order
。
class ProductListFragment: Fragment(){
//skipped irrelevant code
lateinit var viewModel: ProductListViewModel
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
//skipped irrelevant code
val order = arguments?.getSerializable(KEY_ORDER) as ShopperOrder
viewModel = ViewModelProvider(
findNavController().getViewModelStoreOwner(R.id.order_item_graph),// this viewmodel will be shared with ProductFragment so using the nested graph as store owner.
ProductListViewModelFactory(order)// Note this viewModel takes a order parameter
).get(ProductListViewModel::class.java)
viewModel.products.observe(viewLifecycleOwner,Observer { products ->
//This is called when a product is clicked in the product list
viewBinding.recyclerView.adapter = ProductListAdapter(products) { product->
findNavController()
.navigate(R.id.productFragment,ProductFragment.constructArguments(product))
}
}
}
}
产品屏幕:显示产品详细信息。这里有一个下拉列表,用于选择产品是否可用,缺货,已移除,已更换等。此屏幕应将数据从下拉列表发送到ProductListScreen,在此列表中更新以显示此数据。**
class ProductFragment: Fragment(){
//skipped irrelevant code
lateinit var parentViewModel: ProductListViewModel
lateinit var viewModel: ProductViewModel
lateinit var product: Product
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
//skipped irrelevant code
product = arguments?.getSerializable(KEY_PRODUCT) as Product
parentViewModel = ViewModelProvider(
findNavController().getViewModelStoreOwner(R.id.order_item_graph),// this viewmodel will is shared with ProductListFragment so using the nested graph as store owner.
).get(ProductListViewModel::class.java)
//Crash occurs here,when trying to get the shared ProductListViewModel after process death. Read details below
//this ViewModel takes the ProductListViewModel as parentViewModel param
viewModel = ViewModelProvider(this,ProductViewModel.Factory(product,parentViewModel)).get(ProductViewModel::class.java)
}
fun productStatusSelected(status: String){
parentViewModel.updateProductStatus(product,status)
findNavController().popBackStack()
}
}
场景 订单列表>产品列表>产品>单击主页按钮>做了很多其他事情>返回到应用程序> 崩溃
发生的情况是,当ProductFragment重新创建代码以调用共享的ProductListViewModel时,ProductListViewModel应该采用此处未提供的订单参数,并且由于InstantiationException崩溃。 ItemListViewModel类没有零参数构造函数。
错误消息非常清楚,我想知道在这里应该使用哪种策略才能使ViewModel工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。