Here我在MVP结构中向我的演示者注入一个SimpleDynamicString对象。为了避免NullPointerException,我必须实现它。
@Provides
@StringForTextView
static DynamicString provideDynamicString(Application application)
{
return new SimpleDynamicString(application.getString(R.string.example_string));
}
由于我想将此作为库使用,我不得不在任何地方实施。
我可以避免这种情况,所以如果忘记了(accidenataly),是否会发生NullPointerException?
答案 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();