Hilt Fragments 问题 - onAttach 在不同的上下文中多次调用!刀柄碎片不应保留

Hak*_*baş 7 android android-activity dagger-hilt

我在 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)

Rif*_*fat 0

我有类似的问题。所以我正在回答以防有人需要解决方案。

\n

您没有发布片段消费者活动代码或完整片段代码。我将展示我的解决方案代码部分。

\n

就我而言,我有以下代码:

\n
 ////\ncompanion object {\n    const val TAG = "AnotherFragment"\n\n    var instance: AnotherFragment? = null\n\n    fun oneInstance(): AnotherFragment{\n        if (instance == null)\n            instance = AnotherFragment()\n        return instance!!\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

注意:不要多次使用该实例。如果您在父片段的 onCreate 中使用此实例,并且应用程序进入后台并返回到父片段,它将被多次调用并给出错误提示。

\n

解决方案是每次都创建一个新实例。

\n

关于消费者片段:

\n
//do it like:\nval anotherFrament = AnotherFrament() // \xe2\x9c\x94\xef\xb8\x8f this solved my issue\n\n// do not do it like this:\n val anotherFrament = AnotherFrament.oneInstance() // \xe2\x9a\xa0\xef\xb8\x8f\xe2\x9d\x8c\n\n//if data consistency issue appears or something else, handle with lifecycle events.\n
Run Code Online (Sandbox Code Playgroud)\n

我希望能帮助某人。

\n