我在 crashlytics 中遇到了以下崩溃,但无法重现问题。没有我可以用来追踪的异常解释:
dagger.hilt.internal.Preconditions.checkState (Preconditions.java:83)
com.xxx.xxx.ui.base.Hilt_BaseFragment.onAttach (Hilt_BaseFragment.java:46)
androidx.fragment.app.Fragment.onAttach (Fragment.java:1783)
com.xxx.xxx.ui.base.Hilt_BaseFragment.onAttach (Hilt_BaseFragment.java:36)
androidx.fragment.app.Fragment.performAttach (Fragment.java:2922)
androidx.fragment.app.FragmentStateManager.attach (FragmentStateManager.java:464)
Run Code Online (Sandbox Code Playgroud)
在BaseFragment中,有一些注入的对象。
@AndroidEntryPoint
abstract class BaseFragment : FragmentForLifeCycles() {
@Inject
lateinit var injectedClass: InjectedClass
}
Run Code Online (Sandbox Code Playgroud)
没有保留的片段(我的意思是片段没有 setRetainInstance(true) )
在一些从 BaseFragment 派生的片段中,根据该片段注入的需要,是否使用 @AndroidEntryPoint 进行注释。
这是生成的hilt类(Hilt_BaseFragment.java)onAttach块,其中发生了错误;
@Override
@CallSuper
@MainThread
public void onAttach(Activity activity) {
super.onAttach(activity);
Preconditions.checkState(componentContext == null || FragmentComponentManager.findActivity(componentContext) == activity, "onAttach called multiple times with different Context! Hilt Fragments should not be retained.");
initializeComponentContext();
inject();
}
Run Code Online (Sandbox Code Playgroud) 我已经为我的 android 项目实现了 paging3。为了避免重复的项目,我创建了一个 DiffUtil.ItemCallback 对象,如下所示;
companion object {
val diffCallback = object : DiffUtil.ItemCallback<Person>() {
override fun areItemsTheSame(oldItem: Person, newItem: Person): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Person, newItem: Person): Boolean {
return oldItem.id == newItem.id
}
}
}
Run Code Online (Sandbox Code Playgroud)
我在 PagingDataAdapter 中使用了该对象;
class PersonAdapter : PagingDataAdapter<Person, PersonViewHolder>(diffCallback)
Run Code Online (Sandbox Code Playgroud)
在视图中,我从 viewModel 获取 PaginData 并将其提交到适配器中。
private fun observeData() {
lifecycleScope.launch {
viewModel.getPeople().observe(this@MainActivity, {
pagingAdapter.submitData(lifecycle, it)
})
}
Run Code Online (Sandbox Code Playgroud)
在我看来,由于 DiffUtil.ItemCallback,具有相同 id 的人将不会被包含在适配器中。但它没有发生。RecyclerView 会打印每个 person 对象,即使它们具有相同的 id。
如何通过id区分数据?为什么 DiffUtil.ItemCallback 不起作用?谢谢。