22

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

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

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

@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 的片段

4

7 回答 7

9

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

android.useAndroidX=true
android.enableJetifier=true

如果你想注入一个 Fragment 你必须AndroidInjection.inject(this)AndroidSupportInjection.inject(this)

于 2019-02-04T12:25:54.990 回答
4

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

如果 jetifier 不将支持包更改为 androidx 包。您可以从这里下载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 中的库。我不得不手动完成。

于 2019-01-18T12:21:59.700 回答
1

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

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

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

于 2019-01-10T11:59:44.693 回答
0

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

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

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

于 2019-02-07T23:35:36.137 回答
0

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

android.useAndroidX = true
android.enableJetifier = true
于 2018-10-01T15:12:35.030 回答
0

我的特定问题的解决方案是使用 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

于 2019-07-19T16:56:11.050 回答
0

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

  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的 from移动binlibs项目中的文件夹。

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

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

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

于 2019-02-15T08:46:38.990 回答