【问题标题】:Dagger 2 Inject annotation breaks the injectionDagger 2 Inject 注解中断了注入
【发布时间】:2016-08-02 16:33:11
【问题描述】:

我正在使用 dagger 2 将 FragmentManager 和 FragmentTransaction 注入到我的 Activity 中。 一切看起来都很好,直到我添加

@Inject
FragmentManager fragmentManager;

@Inject
FragmentTransaction fragmentTransaction

进入我的活动,它在重建时引发错误,如下所示:

Error:(21, 10) 错误:如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供 android.support.v4.app.FragmentManager。 android.support.v4.app.FragmentManager 在注入 com.toranj.tyke.ui.MainActivity.fragmentManager com.toranj.tyke.ui.MainActivity 被注入 com.toranj.tyke.dagger.components.LotteryComponent.inject(活动)

这是模块

@Module
public class FragmentModule {

    FragmentActivity activity;

    public FragmentModule(FragmentActivity activity) {
        this.activity = activity;
    }

    @Provides
    @PerActivity
    public FragmentManager providesFragmentManager() {
        return activity.getSupportFragmentManager();
    }

    @Provides
    @PerActivity
    public FragmentTransaction providesFragmentTransaction() {
        return activity.getSupportFragmentManager().beginTransaction();
    }
}

这是组件

@PerActivity
@Component(modules = FragmentModule.class)
public interface FragmentComponent {
    void inject(Activity activity);

    FragmentManager fragmentManager();
    FragmentTransaction fragmentTransaction();
}

这是我的活动:

public class MainActivity extends AppCompatActivity {

    @Inject
    FragmentManager fragmentManager;

    @Inject
    FragmentTransaction fragmentTransaction;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FragmentComponent fragmentComponent = DaggerFragmentComponent.builder()
                .fragmentModule(new FragmentModule(this))
                .build();
        fragmentComponent.inject(this);
    }
}

我对使用 dagger 和依赖注入非常陌生,我可能错过了那里的某个地方。任何带有解释的答案都将帮助我理解注入,也非常感谢。

编辑:模块、组件和活动中使用的所有fragmentManager都来自android.support.v4.app.FragmentManager

【问题讨论】:

  • 必须在Activity、Component和Module中使用同一个FragmentManager,检查包。
  • @IsmaelDiVita 他们都来自 android.support.v4.app.FragmentManager 包
  • 你有没有机会用另一个组件注入一个活动?从错误中看起来像这样:LotteryComponent.java

标签: java android dependency-injection dagger-2 dagger


【解决方案1】:

我猜android.app.FragmentManager 用在FragmentComponent 中。

应该改用android.support.v4.app.FragmentManager

【讨论】:

  • 我仔细检查了所有的 FragmentManager 都来自 android.support.v4.app.FragmentManager。
【解决方案2】:

从我在错误中看到的情况来看,您似乎正在使用另一个组件来注入活动:LotteryComponent.java

另外,请尝试更改此方法

@Provides
@PerActivity
public FragmentTransaction providesFragmentTransaction() {
    return activity.getSupportFragmentManager().beginTransaction();
}

@Provides
@PerActivity
public FragmentTransaction providesFragmentTransaction(FragmentManager fm) {
    return fm.beginTransaction();
}

我怀疑这是否能解决问题,但值得一试,至少您将始终如一地从同一来源检索对象。

【讨论】:

  • 感谢您的回复,但不幸的是它没有解决它
【解决方案3】:

你应该注入你真正想要使用的类。

public interface FragmentComponent {
    void inject(Activity activity);
}

这将注入Activity,它是Android 框架的一部分,没有任何@Inject 注释字段。这种注入方法基本上是无操作的。

Dagger 在编译时生成依赖图。它不知道你突然尝试注入MainActivity 并期望FragmentManager 出现。

tl;博士

提供一个

public interface FragmentComponent {
    void inject(MainActivity activity);
}

它应该可以工作。

【讨论】:

  • 您好,感谢您的回复。这实际上是您在此处所说的,但不幸的是,将活动类型更改为 MainActivity 并没有解决问题。难道是我传递给我的模块的活动类型是问题吗?
  • 同样将 fragmentModule 的构造函数中的 FragmentActivity 更改为 AppcompatActivity 并没有修复它
猜你喜欢
  • 2022-09-30
  • 2018-02-22
  • 2018-06-13
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多