gpt4 book ai didi

java - Dagger 2 注入(inject)子类

转载 作者:太空狗 更新时间:2023-10-29 14:00:55 25 4
gpt4 key购买 nike

我知道在 Dagger 2 中我不能注入(inject)一个基类并期望它能转移到子类。但是为什么我不能在子类内部调用 inject 除非我明确地为该类提供了 inject 方法?

我尝试按照本文中的示例进行操作:Dagger 2: Even Sharper, Less Square .这个解决方案应该允许我在子类中调用 inject,但是当我测试它时,我得到了所有 @Inject 目标的 NullPointerException

public abstract class BaseFragment extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
injectComponent(MyApplication.getComponent());
}

protected abstract void injectComponent(AppComponent component);
}

public class MyFragment extends BaseFragment {

@Inject MyDependency mDependency;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mDependency.doSomething(); // NullPointerException
...
}

...

@Override
public void injectComponent(AppComponent component) {
component.inject(this);
}
}

有没有另一种方法可以注入(inject)每个子类,而无需为每个类创建一个注入(inject)方法?或者这是 Dagger 2 的唯一工作方式?如果是这样的话,我将得到一个非常长的 Component 类。为每个 ActivityFragment 或各种其他辅助类使用注入(inject)方法:

@Singleton @Component(modules = {AppModule.class})
public interface AppComponent {

void inject(MyClass clazz);

void inject(MyClass2 clazz);

...

void inject(MyClassN clazz);
}

我宁愿在每个类中调用 component.inject(),也不愿与另一个 inject 方法一起调用。


虽然相似,但我不认为我的问题是重复的Dagger 2 Activity Injection Not Working .这个问题问为什么注入(inject)不起作用,答案是:因为 Dagger 2 有很强的类型关联,你必须为每个类声明一个 inject 方法。这个问题更多地关注绕过样板的方法,同时希望保持强类型关联。

最佳答案

我发现了一个漂亮的小技巧,用于 AsymmetricFingerprintDialog示例应用程序,虽然我不知道我是否完全理解它是如何工作的。该示例使用 Dagger 的第一次迭代,但快速测试表明它也适用于 Dagger 2。

对于每个 Fragment,我添加了一个带有 @Inject 注释的空构造函数,然后使用 @Inject 注释来获取我的 Activity 中的 Fragment

public class MainActivity extends AppCompatActivity {

@Inject MyFragment mFragment;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MyApplication.getComponent().inject(this);
getSupportFragmentManager().beginTransaction
.replace(R.id.fragment_container, mFragment).commit();
...
}
}

public class MyFragment extends Fragment {

@Inject MyDependency mDependency;

@Inject
public MyFragment() {}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mDependency.doSomething();
...
}
}

这允许我仅在每个 Activity 中调用 MyApplication.getComponent().inject(this),依赖项将被注入(inject)到 Fragment 类也是如此。这样,我只需要为每个 Activity 而不是每个 Fragment 一个 inject 方法。

@Singleton @Component(modules = {AppModule.class})
public interface AppComponent {

void inject(MainActivity activity);
}

不过我很好奇它是如何工作的。据我所知,它与 Dagger 无关,相反,它似乎将 @Inject 注释用于其预期目的?虽然我是 Dagger 和 JSR-330 的新手,所以我不确定。


编辑:此方法仅适用于 setRetainInstanceState(true),或者如果您自己保存和恢复实例。

关于java - Dagger 2 注入(inject)子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35582760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com