我能够注入活动、BroadcastReceviers等.,但是当我尝试以相同的方式注入片段时,我得到了以下异常:
.../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/
更新
我希望有一个片段实例,因为我希望切换这样的片段:
Fragment fragment = new WelcomeFragment();
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.replace(R.id.contentFragment, fragment);
transaction.commit();注射碎片:
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)
}
}构成部分:
@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
}
}模块:
@Module
abstract class AbstractAppModule {
@ContributesAndroidInjector
internal abstract fun welcomeFragment(): WelcomeFragment
@ContributesAndroidInjector
internal abstract fun mainActivity(): MainActivity
@ContributesAndroidInjector
internal abstract fun onboardingActivity(): OnboardingActivity
}应用程序:
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发布于 2018-10-09 21:42:55
更新:
我注意到您使用的是android.support.v4.app.Fragment,但是您使用的是应用程序中的片段。你需要添加
implementation 'com.google.dagger:dagger-android-support:2.x' // if you use the support libraries此外,活动需要实现HasFragmentInjector接口。
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);:
public class YourActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
}你加这个模块了吗?
@Module abstract class FragmentModule {
@ContributesAndroidInjector
internal abstract fun contributePhotoPinListFragment(): PhotoPinListFragment
}到AppComponent:
@Singleton
@Component(modules = [..., (FragmentModule::class)])
interface AppComponent {发布于 2018-10-11 07:36:20
看起来您没有为模块中的片段添加提供程序。匕首不知道如何找到你要注入的碎片的对象。因此,在模块类中,您必须创建一个如下所示的提供(只是一个例子)
@Provides
@Singleton
fun provideFragment(): Fragment = Fragment()https://stackoverflow.com/questions/52727824
复制相似问题