【问题标题】:dagger android support to androidx.fragmentdagger android 对 androidx.fragment 的支持
【发布时间】:2018-08-16 15:43:25
【问题描述】:

如何从包androidx.fragment.app.Fragment注入片段?

我正在使用dagger-android framework 在我的代码中注入我的依赖项。

正如文档所说,我这样做是为了注入我的片段

@Override
public void onAttach(Activity activity) {
    AndroidInjection.inject(this);
    super.onAttach(activity);
    // ...
}

问题是 AndroidSupportInjection 类只接受包 android.support.v4.app.Fragment 的片段,或者如果我使用 AndroidInjection 类只接受包的片段android.app.Fragment 我想使用 androidx.fragment.app.Fragment 包的片段。

DaggerFrament 也扩展自 android.support.v4.app.Fragment 并希望使用来自 androidx 的片段

如果我尝试实现 HasSupportFragmentInjector 这个接口也使用来自 android.support 的片段

【问题讨论】:

标签: dagger-2 androidx dagger


【解决方案1】:

将以下代码添加到您的 gradle.properties

android.useAndroidX=true
android.enableJetifier=true

如果您尝试注入 Fragment,则必须将 AndroidInjection.inject(this) 替换为 AndroidSupportInjection.inject(this)

【讨论】:

    【解决方案2】:

    在 HasFragmentInjector 的情况下我遇到了同样的问题。您需要使用 HasSupportFragmentInjector 进行片段注入。这是因为HasFragmentInjector 使用android.app.Fragment,jetifier不受影响。需要添加android-dagger-support库,jetifier在Studio 3.3中将所有支持包转换为androidx(如果jetifier启用)。

    如果 jetifier 不将支持包更改为 androidx 包。您可以从here 下载jetifier 工具并使用以下命令手动转换android-dagger-support.aar 文件。

    ./jetifier-standalone -i dagger-android-support-<version>.aar -o <output-name>
    

    然后将库添加到您的项目中。这是转换后的HasSupportFragment类

    import androidx.fragment.app.Fragment;
    import dagger.android.AndroidInjector;
    
    public interface HasSupportFragmentInjector {
        AndroidInjector<Fragment> supportFragmentInjector();
    }
    

    不知何故,jetifier 工具没有转换 AndroidStudio 中的库。 我必须手动完成。

    【讨论】:

      【解决方案3】:

      我遇到了类似的错误,这是由于 Dagger 版本造成的。在 2.17 版上有一个奇怪的问题,但是如果您回滚到 2.16 版,它可以完美编译(除了 Paul 发布的 gradle.properties 上的标志)。

      从那里使用教程,您将不会遇到麻烦。忘了提到在我的项目中我有所有东西的非androidX版本,然后我运行了android studio提供的androidX迁移,之后我不得不切换Dagger版本,但我想如果你从一开始就这样做是一样的。

      希望这会有所帮助,如果您切换并且它不起作用,请发布一些您的 dagger 实现和插件版本,我会尽力提供更多帮助!

      【讨论】:

        【解决方案4】:

        将以下内容添加到您的 gradle.properties 文件中

        android.useAndroidX = true
        android.enableJetifier = true
        

        【讨论】:

        • 这个选项对我没有帮助:(
        【解决方案5】:

        仅供参考。我有同样的问题。这是Jetifier问题。请将您的 gradle 构建工具插件升级到 3.3.0

                classpath 'com.android.tools.build:gradle:3.3.0' 
        

        示例代码:https://github.com/jega-ms/android-dagger2-mvp-rx

        【讨论】:

          【解决方案6】:

          这就是我为 Dagger 2.21 使用 androidx 命名空间所做的工作

          1. 从此处下载jetifier 工具:https://developer.android.com/studio/command-line/jetifier

          2. 解压到一个文件夹并打开一个指向解压后的bin文件夹的终端

          3. 在 Android Studio 中,打开像 DaggerFragment 这样的类来检查文件存储的路径,对我来说(在 MacOS 中)是这样的:

          4. 从终端执行此命令(替换为正确的变量和路径)

            ./jetifier-standalone -i /Users/{YOUR_USER}/.gradle/caches/{PATH_TO_DAGGER_ANDROID_SUPPORT_FOLDER}/dagger-android-support-2.21.aar -o dagger-android-support-2.21.aar

            转换后的dagger-android-support-2.21.aar 将出现在您的bin 文件夹中

          5. 现在打开您的应用程序build.gradle 文件并更改此行
            implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
            在包含数组中添加, '*.aar' 部分

          6. 将生成的dagger-android-support-2.21.aar从bin移动到项目内的libs文件夹。

          7. 从依赖项中删除(或注释)这一行 implementation "com.google.dagger:dagger-android-support:2.21

            现在您可以继续使缓存无效并重建项目,现在DaggerFragment 将指向您使用androidx.fragment.app.Fragment 的转换版本

          注意:显然这是一个临时解决方法,您应该尽快在 Dagger 中修复此问题

          【讨论】:

          • 如果直接在gradle缓存中更新,还需要手动添加库吗?
          • 我尝试直接在缓存文件夹中替换 aar,但它对我不起作用。只有从 libs 文件夹中引用才是安全的方法
          【解决方案7】:

          我的特殊问题的解决方案是使用 android dagger 类作为接口而不是扩展它们:

          class MyFragment() : HasSupportFragmentInjector {
          
              @Inject
              lateinit var childFragmentInjector: DispatchingAndroidInjector<Fragment>
          
              override fun onAttach(context: Context?) {
                  AndroidSupportInjection.inject(this)
                  super.onAttach(context)
              }
          
              override fun supportFragmentInjector(): AndroidInjector<Fragment> {
                  return childFragmentInjector
              }
          
          ........
          
          }
          

          到我的活动

          class MyActivity : HasSupportFragmentInjector {
              @Inject
              internal lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>
          
              override fun onCreate(savedInstanceState: Bundle?) {
                  AndroidInjection.inject(this)
                  super.onCreate(savedInstanceState)
              }
          
              override fun supportFragmentInjector(): AndroidInjector<Fragment> = fragmentInjector
          

          …… }

          我的 gradle.properties 文件中也有这个:

          android.useAndroidX = true android.enableJetifier = true

          【讨论】:

            猜你喜欢
            • 2018-02-05
            • 2020-08-04
            • 2011-07-15
            • 1970-01-01
            • 2023-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多