如何使Dagger2注射成为可空?

时间:2018-01-31 14:17:20

标签: android kotlin dagger-2 dagger

Here我在MVP结构中向我的演示者注入一个SimpleDynamicString对象。为了避免NullPointerException,我必须实现它。

@Provides
@StringForTextView
static DynamicString provideDynamicString(Application application)
{
    return new SimpleDynamicString(application.getString(R.string.example_string));
}

由于我想将此作为库使用,我不得不在任何地方实施。

我可以避免这种情况,所以如果忘记了(accidenataly),是否会发生NullPointerException?

2 个答案:

答案 0 :(得分:1)

您的DynamicString提供的方法是无范围的。 StringForTextView是限定符注释(意味着如果您有多个提供方法,Dagger可以理解您想要哪个DynamicString )。目前,由于您的提供方法是无范围的,Dagger在您注入时会创建新实例。

如果要在应用程序的任何位置使用DynamicString的相同实例,则需要创建一个Singleton组件,将此方法提供到Singleton模块中并生成方法范围Singleton。如果你创建它Singleton,你可以写一个提供方法并注入任何地方。

@Singleton
@Component(modules = {SingletonModule.class})
public interface SingletonComponent {

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);

        Builder singletonModule(SingletonModule singletonModule);

        SingletonComponent build();
    }

    void inject(YourClassToInject yourClassToInject);

}

@Module
public class SingletonModule {

    @StringForTextView // this is qualifier annotation
    @Singleton // this is scope annotation
    @Provides
    DynamicString provideDynamicString(Application application)
        return new SimpleDynamicString(application.getString(R.string.example_string));
    }
}

有关范围的更多信息:

答案 1 :(得分:0)

我认为你问的是optional binding

@BindsOptionalOf abstract CoffeeCozy optionalCozy();