如何在 Android Fragments and Services 中请求注入?

2022-09-03 05:03:25

我正在按照本教程将Dagger 2添加到我的Android项目中。

完成设置并创建模块和组件后,我可以在活动中添加依赖项,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_account);
    ButterKnife.bind(this);
    ((AppController) getApplication()).getNetComponent().inject(this);
}

我在如何在片段和意图服务中注入依赖关系方面遇到困难?

public class FragmentBrandList extends ListFragment {
}

在此类中,我应该在哪个方法中请求注入,以及该方法的代码是什么?@Override


答案 1

在这个类中,我应该使用哪种@Override方法,以及在片段中添加依赖项的代码是什么?

在片段中调用注入的正确位置是 。这在Dagger 2用户指南的“注入位置”部分中进行了说明onAttach(Context context)

@Override
public void onAttach(Context context) {
    ((AppController) context.getApplicationContext()).getNetComponent().inject(this);
    super.onAttach(context);
}

在服务中调用注入的正确位置是onCreate()

@Override 
public void onCreate() {
    ((AppController) getApplication()).getNetComponent().inject(this);
    super.onCreate();

}

请注意,在这两种情况下,注入请求都出现在调用 之前。Dagger用户指南是这样解释的:super.onCreate()

在活动中调用 super.onCreate() 之前调用 AndroidInjection.inject() 至关重要,因为在配置更改期间调用 super 会从上一个活动实例中附加 Fragments,而这反过来又会注入 Fragments。为了使片段注入成功,必须已经注入活动。对于 ErrorProne 的用户来说,在 super.onCreate() 之后调用 AndroidInjection.inject() 是一个编译器错误。

换句话说:

  1. 活动调用重新附加上一个实例中的片段super.onCreate()
  2. 此调用会导致碎片被重新注入(因为碎片被注入superonAttach)
  3. 片段应该在注入其活动后注入,因此在调用 之前请求注入您的活动。super.onCreate()

您始终可以通过查看类(如 和 )的相关源代码来检查要注入的位置。在此处查看 GitHub 存储库com.google.dagger:dagger-androidDaggerFragmentDaggerService

对于您的具体示例,请确保您已将新的注入站点添加到 NetComponent:

void inject(FragmentBrandList frag);

void inject(BrandListService service);

答案 2

步骤 1:创建应用程序模块

@Module
public class ApplicationModule {

    private final DIApplication application;

    public ApplicationModule(DIApplication application) {
        this.application = application;
    }

    @Provides @Singleton
    public DIApplication provideApplication() {
        return application;
    }

    @Provides @Singleton
    public DogModel provideDogModel() {
        return new DogModelImpl("Scooby-doo");
    }

}

步骤 2:创建应用程序组件:

@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
    void inject(DIApplication application);

    void inject(BaseActivity activity);
    void inject(BaseFragment fragment);

    void inject(DogSyncService service);
}

步骤 3:创建 DI 类:

public class DependencyInjector {

    private static ApplicationComponent applicationComponent;

    public static void initialize(DIApplication diApplication) {
        applicationComponent = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(diApplication))
                .build();
    }

    public static ApplicationComponent applicationComponent() {
        return applicationComponent;
    }

    private DependencyInjector(){}
}

最后一步:使用以下方法在任何地方注射:

DependencyInjector.applicationComponent()

您的问题启发了我创建一个演示项目,该项目显示了使用Dagger2进行的活动,片段和服务注入。这是git:https://github.com/write2sv/AndroidDIDagger2/tree/master/app/src/main/java/work/shaggy/didemo


推荐