如果没有 @Provides- 或 @Produces- 注释方法,则无法提供 AndroidInjector<android.app.Activity>

AndroidInjector<android.app.Activity> cannot be provided without an @Provides- or @Produces-annotated method

我在尝试从 Dagger v2.11[= 获取新的 Android dagger 类 时遇到错误52=] 在我们的项目中工作。我不确定问题出在哪里,因为我已经考虑了 https://google.github.io/dagger//android.html 上的 Android 文档,但仍然无法解决这个问题。关于此设置有什么问题的任何想法?

我的申请:

public class MyApplication extends Application implements HasActivityInjector
{
    @Inject
    AndroidInjector<Activity> androidInjector;

    @Override
    public void onCreate()
    {
        super.onCreate();
        AppInjector.init(this);
    }

    @Override
    public AndroidInjector<Activity> activityInjector()
    {
        return androidInjector;
    }
}

AppComponent:

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class,
        AppModule.class,
        ActivityModule.class,
})
public interface AppComponent
{
    @Component.Builder
    interface Builder
    {
        @BindsInstance
        Builder application(Application application);

        AppComponent build();
    }

    void inject(MyApplication myApplication);
}

ActivityModule:

@Module
abstract class ActivityModule
{
    @ContributesAndroidInjector(modules = FragmentModule.class)
    abstract MainActivity contributeMainActivity();

    // all other activities defined as above
}

片段模块:

@Module
abstract class FragmentModule
{
    @ContributesAndroidInjector
    abstract MyFragment contributeMyFragment();
}

AppInjector:

 public static void init(MyApplication myApplication)
    {
        DaggerAppComponent.builder().application(myApplication)
                          .build().inject(myApplication);
        myApplication
                .registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks()
                {
                    @Override
                    public void onActivityCreated(Activity activity, Bundle savedInstanceState)
                    {
                        handleActivity(activity);
                    }

                    @Override
                    public void onActivityStarted(Activity activity)
                    {

                    }

                    @Override
                    public void onActivityResumed(Activity activity)
                    {

                    }

                    @Override
                    public void onActivityPaused(Activity activity)
                    {

                    }

                    @Override
                    public void onActivityStopped(Activity activity)
                    {

                    }

                    @Override
                    public void onActivitySaveInstanceState(Activity activity, Bundle outState)
                    {

                    }

                    @Override
                    public void onActivityDestroyed(Activity activity)
                    {

                    }
                });
    }

    private static void handleActivity(Activity activity)
    {
        if (activity instanceof HasSupportFragmentInjector)
        {
            AndroidInjection.inject(activity);
        }
        if (activity instanceof FragmentActivity)
        {
            ((FragmentActivity) activity).getSupportFragmentManager()
                                         .registerFragmentLifecycleCallbacks(
                                                 new FragmentManager.FragmentLifecycleCallbacks()
                                                 {
                                                     @Override
                                                     public void onFragmentCreated(FragmentManager fm, Fragment f,
                                                                                   Bundle savedInstanceState)
                                                     {
                                                         if (f instanceof Injectable)
                                                         {
                                                             AndroidSupportInjection.inject(f);
                                                         }
                                                     }
                                                 }, true);
        }
    }

AppModule:

@Module(includes = ViewModelModule.class)
class AppModule
{
    @Singleton
    @Provides
    UserDao provideUserDao(MyDatabase db)
    {
        return db.userDao();
    }

    // all other DAOs
}

ViewModelModule:

@Module
abstract class ViewModelModule
{
    @Binds
    @IntoMap
    @ViewModelKey(UserViewModel.class)
    abstract ViewModel bindUserViewModel(UserViewModel userViewModel);
}

主要活动:

public class MainActivity extends AppCompatActivity implements HasSupportFragmentInjector
{
     @Inject
    AndroidInjector<Fragment> androidInjector;

    @Override
    public AndroidInjector<Fragment> supportFragmentInjector()
    {
        return androidInjector;
    }
}

堆栈跟踪:

Error:(29, 10) error: dagger.android.AndroidInjector<android.app.Activity> cannot be provided without an @Provides- or @Produces-annotated method.
dagger.android.AndroidInjector<android.app.Activity> is injected at
com.myapp.MyApplication.androidInjector
com.myapp.MyApplication is injected at
com.myapp.dagger.AppComponent.inject(myApplication)

尝试将您的 androidInjector 变量的 AndroidInjector 替换为 DispatchingAndroidInjector。 那是为我工作。这是我的 (kotlin)

class PodcastApp : Application(), HasActivityInjector {

@Inject
lateinit var dispatchingAndroidInjector : DispatchingAndroidInjector<Activity>


companion object {
    lateinit var instance: PodcastApp
}


override fun onCreate() {
    super.onCreate()

    instance = this
    FirebaseApp.initializeApp(this)

    if (BuildConfig.DEBUG) {
        Timber.plant(Timber.DebugTree())
        Stetho.initializeWithDefaults(this)

        AppInjector.init(this)
    }
}

override fun activityInjector(): AndroidInjector<Activity> {
    return dispatchingAndroidInjector
}

}