首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能用匕首2注入片段

不能用匕首2注入片段
EN

Stack Overflow用户
提问于 2018-10-09 19:09:11
回答 2查看 4.1K关注 0票数 0

我能够注入活动、BroadcastReceviers等.,但是当我尝试以相同的方式注入片段时,我得到了以下异常:

代码语言:javascript
复制
.../AppComponent.java:8: error: [Dagger/MissingBinding] [dagger.android.AndroidInjector.inject(T)] java.util.Map<java.lang.String,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> cannot be provided without an @Provides-annotated method.
    public abstract interface AppComponent extends dagger.android.AndroidInjector<com.inepex.simpleclient.App> {
                    ^
          java.util.Map<java.lang.String,javax.inject.Provider<dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>> is injected at
              dagger.android.DispatchingAndroidInjector.<init>(…, injectorFactoriesWithStringKeys)
          dagger.android.DispatchingAndroidInjector<android.support.v4.app.Fragment> is injected at
              com.inepex.tracker.SimpleTrackerApp.fragmentInjector
          com.inepex.simpleclient.App is injected at
              dagger.android.AndroidInjector.inject(T)

我遵循这样的描述:https://code.luasoftware.com/tutorials/android/dagger2-injection-for-fragment/

更新

我希望有一个片段实例,因为我希望切换这样的片段:

代码语言:javascript
复制
Fragment fragment = new WelcomeFragment();

FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.contentFragment, fragment);
transaction.commit();

注射碎片:

代码语言:javascript
复制
class MainActivity : BaseActivity() {

    @Inject
    lateinit var welcomeFragment: WelcomeFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        AndroidInjection.inject(this)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ButterKnife.bind(this)
    }
}

构成部分:

代码语言:javascript
复制
@Component(modules = arrayOf(AndroidInjectionModule::class, AppModule::class, AbstractAppModule::class, AbstractLibModule::class, LibModule::class))
@Singleton
interface AppComponent : AndroidInjector<App> {

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: App): Builder

        fun build(): AppComponent
    }
}

模块:

代码语言:javascript
复制
@Module
abstract class AbstractAppModule {

    @ContributesAndroidInjector
    internal abstract fun welcomeFragment(): WelcomeFragment

    @ContributesAndroidInjector
    internal abstract fun mainActivity(): MainActivity

    @ContributesAndroidInjector
    internal abstract fun onboardingActivity(): OnboardingActivity
}

应用程序:

代码语言:javascript
复制
open class SimpleTrackerApp : MultiDexApplication(),
        HasActivityInjector,
        HasServiceInjector,
        HasBroadcastReceiverInjector,
        HasSupportFragmentInjector {


    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    @Inject
    lateinit var dispatchingServiceInjector: DispatchingAndroidInjector<Service>

    @Inject
    lateinit var dispatchingBroadcastReceiverInjector: DispatchingAndroidInjector<BroadcastReceiver>

    @Inject
    lateinit var fragmentInjector: DispatchingAndroidInjector<Fragment>

    override fun activityInjector(): AndroidInjector<Activity> = dispatchingAndroidInjector

    override fun serviceInjector(): AndroidInjector<Service> = dispatchingServiceInjector

    override fun broadcastReceiverInjector(): AndroidInjector<BroadcastReceiver> =
            dispatchingBroadcastReceiverInjector

    override fun supportFragmentInjector(): DispatchingAndroidInjector<Fragment> = fragmentInjector
EN

回答 2

Stack Overflow用户

发布于 2018-10-09 21:42:55

更新:

我注意到您使用的是android.support.v4.app.Fragment,但是您使用的是应用程序中的片段。你需要添加

代码语言:javascript
复制
implementation 'com.google.dagger:dagger-android-support:2.x' // if you use the support libraries

此外,活动需要实现HasFragmentInjector接口。

代码语言:javascript
复制
public class YourActivity extends Activity
    implements HasFragmentInjector {
  @Inject DispatchingAndroidInjector<Fragment> fragmentInjector;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    AndroidInjection.inject(this);
    super.onCreate(savedInstanceState);
    // ...
  }

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

更新:

首先,在创建之前需要注入片段。

最后,在Activity.onCreate()方法中,在调用super.onCreate()之前调用AndroidInjection.inject(this);:

代码语言:javascript
复制
public class YourActivity extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    AndroidInjection.inject(this);
    super.onCreate(savedInstanceState);
  }
}

文档

你加这个模块了吗?

代码语言:javascript
复制
@Module abstract class FragmentModule {
    @ContributesAndroidInjector
    internal abstract fun contributePhotoPinListFragment(): PhotoPinListFragment
}

到AppComponent:

代码语言:javascript
复制
@Singleton
@Component(modules = [..., (FragmentModule::class)])
interface AppComponent {
票数 0
EN

Stack Overflow用户

发布于 2018-10-11 07:36:20

看起来您没有为模块中的片段添加提供程序。匕首不知道如何找到你要注入的碎片的对象。因此,在模块类中,您必须创建一个如下所示的提供(只是一个例子)

代码语言:javascript
复制
@Provides
@Singleton
fun provideFragment(): Fragment = Fragment()
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52727824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档