试图了解Google发布的MVVM示例

时间:2018-04-10 09:46:54

标签: android dagger-2

民间,

我正在尝试了解谷歌发布的与Android架构相关的代码示例。我正在浏览GithubBrowserSample(https://github.com/googlesamples/android-architecture-components/tree/master/GithubBrowserSample)并尝试创建自己的项目以更好地理解它。但是我被卡住了,因为我无法理解“NavigationController.java”类是如何被实例化的。 因为在我的项目中,当我尝试运行时,我正在尝试调用“NavigationController.navigateToSearch”来获取空指针异常

你能帮助这里的人吗?

我的GitHub存储库的链接是 https://github.com/saunaklogan/DemoArchitecture

1 个答案:

答案 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
})