匕首注入超类和子类

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