如果没有@ Provide-或@ Produces-annotated方法,则无法提供AndroidInjector <android.app.activity>

时间:2017-07-02 08:20:23

标签: android dependency-injection dagger-2

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

MyApplication的:

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
}

FragmentModule:

@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);
}

MainActivity:

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)

1 个答案:

答案 0 :(得分:12)

尝试将 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
}

}