民间,
我正在尝试了解谷歌发布的与Android架构相关的代码示例。我正在浏览GithubBrowserSample(https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample)并尝试创建自己的项目以更好地理解它。但是我被卡住了,因为我无法理解“NavigationController.java”类是如何被实例化的。 因为在我的项目中,当我尝试运行时,我正在尝试调用“NavigationController.navigateToSearch”来获取空指针异常
你能帮助这里的人吗?
我的GitHub存储库的链接是 https://github.com/saunaklogan/DemoArchitecture
答案 0 :(得分:4)
public class NavigationController {
private final int containerId;
private final FragmentManager fragmentManager;
@Inject
public NavigationController(MainActivity mainActivity) {
我们看到它有一个Inject构造函数,所以Dagger2会看到它。我们还看到这个类没有范围注释,所以除非将它绑定到给定范围的模块中,否则它将是未范围的。它接收MainActivity作为参数,因此它将由知道MainActivity的组件实例化。
应用程序中只有一个活动,并且有多个片段,因此只需使用活动作用域子组件来注入活动。
这是自动的,因为它是在创建Activity时由AppInjector完成的,并调用AndroidInjection.inject(activity)
查找可以注入MainActivity的Activity作用域组件。
public class AppInjector {
private AppInjector() {}
public static void init(GithubApp githubApp) {
DaggerAppComponent.builder().application(githubApp)
.build().inject(githubApp);
githubApp
.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
handleActivity(activity);
}
它在Application类中初始化。
public class GithubApp extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
@Override
public void onCreate() {
super.onCreate();
if (BuildConfig.DEBUG) {
Timber.plant(new Timber.DebugTree());
}
AppInjector.init(this); // <--
}
绑定MainActivity
实例的子组件的定义位于MainActivityModule。
@Module
public abstract class MainActivityModule {
@ContributesAndroidInjector(modules = FragmentBuildersModule.class)
abstract MainActivity contributeMainActivity();
}
将其添加到全局组件中。
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
MainActivityModule.class
})