android - 如何使用 Dagger2 将 Activity 注入(inject)到 Fragment 中

标签 android dagger-2 dagger

我正在尝试将我的 MainActivity 注入(inject) fragment 。我有一个在我的 MainActivity 中实现的接口(interface),它将监听来自 Fragment 的事件。所以我想注入(inject) MainActivity 并在其上调用事件监听器。

我已尝试执行以下操作,但未能成功。仅显示代码 fragment 。

界面

public interface RecipeItemListener {
    void onRecipeItem();
}

实现接口(interface)的MainActivity

public class MainActivity extends AppCompatActivity implements RecipeItemListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if(savedInstanceState == null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.main_fragment_container, RecipeListView.newInstance(), RecipeListView.TAG)
                    .commit();
        }
    }

    @Override
    public void onRecipeItem() {
        Timber.d("onRecipeItem");
    }
}

我的提供 MainActivity 的模块

@Module
public class RecipeListModule {
    private MainActivity mainActivity;

    public RecipeListModule(MainActivity mainActivity) {
        this.mainActivity = mainActivity;
    }

    @RecipeListScope
    @Provides
    public RecipeItemListener providesRecipeListMainActivity() {
        return mainActivity;
    }
}

我的主要组件

@Singleton
@Component(modules = {
        AndroidModule.class,
        NetworkModule.class})
public interface BusbyBakingComponent {
    RecipeListComponent add(RecipeListModule recipeListModule);
}

我的子组件

@RecipeListScope
@Subcomponent(modules = {RecipeListModule.class})
public interface RecipeListComponent {
    void inject(RecipeListView target);
}

我的应用类

public class BusbyBakingApplication extends Application {
    private BusbyBakingComponent applicationComponent;
    private RecipeListComponent recipeListComponent;

    @Override
    public void onCreate() {
        super.onCreate();

        applicationComponent = createApplicationComponent();
    }

    public BusbyBakingComponent createApplicationComponent() {
        return DaggerBusbyBakingComponent.builder()
                .networkModule(new NetworkModule())
                .androidModule(new AndroidModule(BusbyBakingApplication.this))
                .build();
    }

    public BusbyBakingComponent getApplicationComponent() {
        return applicationComponent;
    }

    public RecipeListComponent createRecipeListComponent(MainActivity activity) {
        recipeListComponent = applicationComponent.add(new RecipeListModule(activity));
        return recipeListComponent;
    }

    public void releaseRecipeListComponent() {
        recipeListComponent = null;
    }
}

在我的 fragment 中,这就是我尝试注入(inject)的方式:

@Inject MainActivity mainActivity;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ((BusbyBakingApplication)getActivity().getApplication())
            .createRecipeListComponent((MainActivity)getActivity())
            .inject(RecipeListView.this);
}

我不断收到以下错误:

Error:(14, 8) error: [me.androidbox.busbybaking.di.RecipeListComponent.inject(me.androidbox.busbybaking.recipieslist.RecipeListView)] me.androidbox.busbybaking.recipieslist.MainActivity cannot be provided without an @Inject constructor or from an @Provides- or @Produces-annotated method.
me.androidbox.busbybaking.recipieslist.MainActivity is injected at
me.androidbox.busbybaking.recipieslist.RecipeListView.mainActivity
me.androidbox.busbybaking.recipieslist.RecipeListView is injected at
me.androidbox.busbybaking.di.RecipeListComponent.inject(target)

非常感谢您的任何建议。

最佳答案

如果你看一下你的模块

@RecipeListScope
@Provides
public RecipeItemListener providesRecipeListMainActivity() {
    return mainActivity;
}

您提供接口(interface)(这很好)而不是 MainActivity(实现)。

由于您请求 MainActivity

@Inject MainActivity mainActivity;

您收到此错误:

MainActivity cannot be provided [...]

因为您只提供RecipeItemListener


将您的代码从要求RecipeListView 中的MainActivity 更改为

@Inject RecipeItemListener recipeListener;

如果您的其余设置正确,它应该可以工作。

关于android - 如何使用 Dagger2 将 Activity 注入(inject)到 Fragment 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44464841/

相关文章:

android - 在整个 map 上绘制多边形

android - 油煎面包 block 不时出现

java - 解决java.lang.InknownClassChangeError : android. support.v4.content.ContextCompat

android - 运行什么任务来重新创建 Dagger 2 注入(inject)文件

dependency-injection - 带有构造函数参数的 Dagger 模块?

android - 错误 : @Component. Builder 缺少 Dagger 2 中所需模块或组件的 setter ,而不是 setter 方法

android - 如何更改 AlertDialog 标题的颜色及其下方线条的颜色

java - 如何使用 Dagger2 实例化具有动态成员的对象?

android - LiveData 观察永远不工作

java - Java 中的 'ClassName.class' 与 Kotlin 中的 '[ClassName::class]' 相同吗?