1 - 範囲:このダガー2の簡単な例で何が問題になっていますか?
@Scope
@Retention(RetentionPolicy.CLASS)
public @interface PerInstance {}
2 - AppContextModule:
@Module
public class AppContextModule {
Application application;
public AppContextModule(Application application){
this.application = application;
}
@Provides
public Application application(){
return this.application;
}
@Provides
public Context context(){
return this.application;
}
@Provides
public LocationManager locationManager(Context context){
return (LocationManager) context.getSystemService(context.LOCATION_SERVICE);
}
}
3 - MeuPrimeiroModule:
@Module
public class MeuPrimeiroModule {
@Provides
@PerInstance
public String nome() {
return new String("Gorick");
}
}
4 - MeuSegundoModule:
@Module(includes = MeuPrimeiroModule.class)
public class MeuSegundoModule {
@Provides
@Singleton
public String nomeCompleto(MeuPrimeiroModule meuPrimeiroModule) {
return new String(meuPrimeiroModule + " Silva");
}
}
5 - MeuPrimeiroComponent:
@PerInstance
@Component(modules={MeuPrimeiroModule.class})
public interface MeuPrimeiroComponent {
void inject(MainActivity mainActivity);
}
6 - MeuSegundoComponent:
@Singleton
@Component(modules={MeuSegundoComponent.class})
public interface MeuSegundoComponent extends MeuPrimeiroComponent {
void inject(MainActivity mainActivity);
}
7 - AppContextComponent:
public interface AppContextComponent {
Application app(); //provision method
Context applicationContext(); //provision method
LocationManager locationManager(); //provision method
}
8 - ApplicationComponent:
@Singleton
@Component(modules={AppContextModule.class})
public interface ApplicationComponent extends AppContextComponent {
void inject(MainActivity mainActivity);
}
9 - MainActivity:
public class MainActivity extends AppCompatActivity {
@Inject
MeuPrimeiroComponent meuPrimeiroComponent;
@Inject
MeuSegundoComponent meuSegundoComponent;
TextView nome, nomeCompleto;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nome = (TextView) findViewById(R.id.nome);
nomeCompleto = (TextView) findViewById(R.id.nomeCompleto);
setNome(nome, nomeCompleto);
}
public void setNome(TextView nome, TextView nomeCompleto){
nome.setText(meuPrimeiroComponent.toString());
nomeCompleto.setText(meuSegundoComponent.toString());
}
}
体型:
Error:(16, 10) error: gorick.dagger2.Dagger2.Component.MeuPrimeiroComponent cannot be provided without an @Provides- or @Produces-annotated method.
gorick.dagger2.Dagger2.Component.MeuPrimeiroComponent is injected at
gorick.dagger2.MainActivity.meuPrimeiroComponent
gorick.dagger2.MainActivity is injected at
gorick.dagger2.Dagger2.Component.ApplicationComponent.inject(mainActivity)
PS:meuPrimeiroComponent.nome()を使用すると、アンドロイドスタジオはnome()メソッドを見つけられません。
「MainActivity」はどこから注入されましたか? –
MeuPrimeiroComponentから。 –