草庐IT

AndroidInjector<android.app.Activity> 不能在没有 @Provides- 或 @Produces- 注释的方法的情况下提供

coder 2023-11-30 原文

我在尝试从 Dagger v2.11 中获取新的 Android dagger 类时遇到错误,该类在我们的项目中运行。我不确定问题出在哪里,因为我已经考虑了 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;
    }
}

应用组件:

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

Activity 模块:

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

    // all other activities defined as above
}

fragment 模块:

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

应用注入(inject)器:

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

应用模块:

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

    // all other DAOs
}

View 模型模块:

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

主要 Activity :

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 替换为 DispatchingAndroidInjector 您的 androidInjector 变量。 那是为我工作。这是我的(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
}

关于AndroidInjector<android.app.Activity> 不能在没有 @Provides- 或 @Produces- 注释的方法的情况下提供,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44868784/

有关AndroidInjector<android.app.Activity> 不能在没有 @Provides- 或 @Produces- 注释的方法的情况下提供的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby - 默认情况下使选项为 false - 2

    这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb

  3. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  4. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  7. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  8. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  9. ruby - 在不使用 RVM 的情况下在 Mac 上卸载和升级 Ruby - 2

    我最近决定从我的系统中卸载RVM。在thispage提出的一些论点说服我:实际上,我的决定是,我根本不想担心Ruby的多个版本。我只想使用1.9.2-p290版本而不用担心其他任何事情。但是,当我在我的Mac上运行ruby--version时,它告诉我我的版本是1.8.7。我四处寻找如何简单地从我的Mac上卸载这个Ruby,但奇怪的是我没有找到任何东西。似乎唯一想卸载Ruby的人运行linux,而使用Mac的每个人都推荐RVM。如何从我的Mac上卸载Ruby1.8.7?我想升级到1.9.2-p290版本,并且我希望我的系统上只有一个版本。 最佳答案

  10. ruby - 使用 postgres.app 在 rvm 下要求 pg 时出错 - 2

    我正在使用Postgres.app在OSX(10.8.3)上。我已经修改了我的PATH,以便应用程序的bin文件夹位于所有其他文件夹之前。Rammy:~phrogz$whichpg_config/Applications/Postgres.app/Contents/MacOS/bin/pg_config我已经安装了rvm并且可以毫无错误地安装pggem,但是当我需要它时我得到一个错误:Rammy:~phrogz$gem-v1.8.25Rammy:~phrogz$geminstallpgFetching:pg-0.15.1.gem(100%)Buildingnativeextension

随机推荐