匕首注入超类和子类
BaseFragment类
open class BaseFragment : Fragment() { @Inject lateinit var apiManager: ApiManager @Inject lateinit var eventBus: EventBus override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) App.getInstance().component.inject(this) } override fun onStop() { eventBus.unreg(this) super.onStop() } override fun onStart() { super.onStart() eventBus.reg(this) } }
RoomsFragment类
class RoomsFragment : BaseFragment() { @Inject lateinit var roomAdapter: RoomsAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) App.getInstance().component.inject(this) } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater?.inflate(R.layout.fragment_rooms_fragment_new, container, false) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) recyclerView.adapter = roomAdapter //This line throws null or lateinit property roomAdapter has not been initialized } }
AdapterModule类
@Module(includes = AppModule.class) public class AdapterModule { @Provides //App module has EventBus so i included it in Module RoomsAdapter provideRoomsAdapter(EventBus eventBus) { return new RoomsAdapter(eventBus); } }
AppComonent类
@Singleton @Component(modules = {AppModule.class, AdapterModule.class}) public interface ApplicationComponent { void inject(ApiManager apiManager); void inject(BaseFragment baseFragment); }
正如你可以看到我试图在超类和子类中注入对象,但它不是按预期方式工作。 BaseFragment
注入对象工作查找但RoomsFragment
注入失败。 任何解决方案
修复:我忘了为ApplicationComponent中的子类RoomsFragment
添加接口。 由于其超类BaseFragment
接口存在,因此在编译时不会BaseFragment
任何错误。
@Singleton @Component(modules = {AppModule.class, AdapterModule.class}) public interface ApplicationComponent { void inject(RoomsFragment roomsFragment); void inject(ApiManager apiManager); void inject(BaseFragment baseFragment); }
尝试这个:
@Singleton @Component(modules = {AppModule.class, AdapterModule.class}) public interface ApplicationComponent { void inject(ApiManager apiManager); void inject(BaseFragment baseFragment); void inject(RoomsFragment roomsFragment); }
@Component
文档中的成员注入方法的文档描述了相关的行为。
它看起来像你正在尝试注入RoomsFragment
成员。 通过添加一个接受RoomsFragment
的方法,您将注入RoomsFragment
的@Inject
成员和任何超类型(在本例中为`BaseFragment)。
另一方面,如果调用接受BaseFragment
的成员注入方法,则将注入BaseFragment
的@Inject
成员,但不注入任何子类型的成员。 因此,为抽象类型定义成员注入方法几乎不是一个好主意。
在原来的问题中,所有成员注入方法都被定义为相互重载,这一点变得复杂了。 这意味着,对于给定的类型,您将得到不同的注入行为,具体取决于超载如何解决。 请参阅有效的Java 2:项目41了解更多关于为什么这些重载容易出错的背景信息。
还值得注意的是,在原始代码示例中,有一个ApiManager
的成员注入方法,但是该类型作为实例注入到BaseFragment
。 注入成员可以自动解析依赖关系,因此不需要为ApiManager
上的ApiManager
定义任何方法。
因此,为了注入RoomsFragment
所有成员(声明和inhertied),只需为RoomsFragment
定义一个成员注入方法:
@Singleton @Component(modules = {AppModule.class, AdapterModule.class}) public interface ApplicationComponent { void inject(RoomsFragment roomsFragment); }
- 匕首2与Kotlin,在ApplicationComponent中返回泛型类型
- 匕首2错误:依赖“不能提供没有@Inject构造函数”
- 匕首和Kotlin。 匕首不生成组件类
- AndroidInjector <android.app.Activity>不能提供@ Provide或者@ Produces注解的方法
- Kotlin Kapt:java.lang.IllegalStateException:endPosTable已经设置
- Android库,Kotlin和Dagger2
- 使用Retrofit 2和Kotlin获取错误的原始HTML / JSON响应
- 你如何在Kotlin中用Dagger 2注入命名的字段参数?
- 用匕首在Kotlin中注入Generic类型2