【问题标题】:Injecting Androidx Fragments using Dagger 2使用 Dagger 2 注入 Androidx 片段
【发布时间】:2018-08-13 17:30:28
【问题描述】:

我想使用 dagger 2 注入我的 Androidx 片段。在我的活动中,我有:

public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector
{
    @Inject Repository repository;
    @Inject DispatchingAndroidInjector<androidx.fragment.app.Fragment> dispatchingAndroidInjector;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
       
    @Override
    public AndroidInjector<androidx.fragment.app.Fragment> supportFragmentInjector()
    {
        return dispatchingAndroidInjector;
    }
}

问题是当我想构建项目时出现此错误:

error: cannot find symbol class MapBuilder

当我在 DispatchingAndroidInjector 中将 androidx.fragment.app.Fragment 更改为 Fragment 时,我不再收到此错误。

【问题讨论】:

    标签: android dependency-injection dagger-2 dagger


    【解决方案1】:

    以下内容对我有用:

    首先,为支持库添加gradle依赖dagger:

    implementation "com.google.dagger:dagger-android-support:2.23.2"
    

    然后在 androidx.fragment 的子片段中以以下方式注入:

    AndroidSupportInjection.inject(this)
    

    【讨论】:

      【解决方案2】:

      Androidx 尚不支持,但启用 jetifier 可能会解决您的问题。

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

      android.useAndroidX=true
      android.enableJetifier=true
      

      另请参阅这些问题以了解详细信息:

      【讨论】:

      • 感谢您的回答。它工作,但我不得不升级匕首到 2.16 版本。
      • 即使我启用 jetifier Dagger 2.19 版,它仍然不接受 android x Fragment
      • 我正在使用带有 androidx 的 Dagger 2.21,它可以工作,但你必须使用 AndroidSupportInjection.inject(this),正如下面提到的 @cherif。
      【解决方案3】:

      AndroidX 缺少对 Dagger 的支持。 2.21及以上版本新增

      所以你可以把它当作-

      implementation 'com.google.dagger:dagger:2.21'
      implementation 'com.google.dagger:dagger-android:2.21'
      implementation 'com.google.dagger:dagger-android-support:2.21'
      kapt "com.google.dagger:dagger-compiler:2.21"
      kapt "com.google.dagger:dagger-android-processor:2.21"
      

      除此之外,如果您是第一次使用并从支持迁移到 AndroidX,您还需要注意@Saeed Masoumi 提到的gradle.properties。您需要添加以下内容 -

      android.useAndroidX=true
      android.enableJetifier=true
      

      Jetifier 将帮助您在运行时从 support 库迁移到 AndroidX 包。您可以在这里找到最佳答案 - https://stackoverflow.com/a/52002285/842607

      【讨论】:

      • 既然你现在在评论,你试过koin吗?如果您使用的是 Kotlin,并且需要注入,请比较 Koin 与 Dagger 并使用。 github.com/InsertKoinIO/koin
      • @jimt patel 是的,我试过了。卡了两天,现在解决了。谢谢!
      • 是的,我正在使用 kotlin,肯定会尝试 koin。
      【解决方案4】:

      如前所述,将以下代码添加到您的 gradle.properties

      android.useAndroidX=true
      android.enableJetifier=true

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

      【讨论】:

        【解决方案5】:

        如果 jetifier 不将 s支持包 更改为 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 中的库。 我必须手动完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-31
          • 1970-01-01
          相关资源
          最近更新 更多