2016-04-07 25 views
0

Ich habe App mit Subcomponent s wie dieseDagger 2 Modul außer Kraft setzen in Subkomponente

-------- ApplicationComponent ------------ 
     |     | 
     |     | 
     |     | 
    Service Component  Activity Component 
           | 
           | 
           | 
          Fragment Component 

Alles funktioniert gut, aber ich möchte eine Sache tun. Android M requires runtime permissions so I decided to create-Controller , something like helper class that will be injected into Fragment or Activity` Common Interface

public interface PermissionController { 

    boolean hasPermissionInManifest(String permissionName); 

    boolean isPermissionGranted(String permission); 

/** 
* Request permission for Android 6 
* 
* @param permission permission that is requested 
* @param requestCode request code 
* @return if user is going to be asked about permission so we need to handle callback, otherwise 
* user was already asked or permission is not required cause of android lower version 
*/ 
boolean requestPermission(int requestCode, String permission); 

    void requestPermissions(int requestCode, String... permissions); 

} 

Und eine Methode aus verschiedenen Implementierungen PermissionActivityManager und PermissionFragmentManager

@Override 
    public boolean requestPermission(int requestCode, String permission) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (mContext.checkSelfPermission(permission) 
        != PackageManager.PERMISSION_GRANTED) { 
       mContext.requestPermissions(new String[]{permission}, 
         requestCode); 
       return true; 
      } 
     } 
     return false; 
    } 

Und Fragment Implementierung

@Override 
    public boolean requestPermission(int requestCode, String permission) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(mFragment.getActivity(), permission) 
        != PackageManager.PERMISSION_GRANTED) { 
       mFragment.requestPermissions(new String[]{permission}, 
         requestCode); 
       return true; 
      } 
     } 
     return false; 
    } 

Hoffnung y Du hast eine Idee.

Aber über das Problem, mein FragmentComponent ist Subkomponente von ActivityComponent

beide Sie haben PermissionModule

@PerActivity 
@Subcomponent(
     modules = { 
       ActivityModule.class, 
       PermissionModule.class 
     }) 
public interface ActivityComponent { 
    Activity activity(); 

    FragmentComponent fragmentComponent(FragmentModule module); 

    void inject(BaseActivity baseActivity); 

    void inject(MainAppActivity mainAppActivity); 

} 

Und für Fragment

@Subcomponent(
     modules = { 
       FragmentModule.class, 
       ProviderModule.class, 
       PermissionModule.class 
     }) 
@PerFragment 
public interface FragmentComponent { 
    Fragment fragment(); 

    void inject(BaseFragment baseFragment); 

} 

und Module sind die gleichen, außer Anmerkungen und zurück Instanzen .

@PerFragment 
@Module 
public class PermissionModule { 
    @PerFragment 
    @Provides 
    PermissionController providePermissionController(Fragment fragment) { 
     return new PermissionFragmentManager(fragment); 
    } 
} 

@PerActivity 
@Module 
public class PermissionModule { 
    @PerActivity 
    @Provides 
    PermissionController providePermissionController(Activity activity) { 
     return new PermissionActivityManager(activity); 
    } 
} 

Also meine Frage ist - wenn es eine Möglichkeit ist provide Methode in übergeordneter Komponente außer Kraft zu setzen oder es gibt einen anderen Weg, um das Problem zu lösen? Weil in meinem Fall PermissionActivityManager injiziert wurde.

Antwort

1

@Subcomponent erbt alle Bindungen von der Superscoped-Komponente. In diesem Fall ist das die Komponente @ActivityScope.

Wenn Sie die geerbten Abhängigkeiten steuern möchten, müssen Sie Komponentenabhängigkeiten verwenden. Mit Komponentenabhängigkeiten können Sie nur die von den Bereitstellungsmethoden angegebenen Bindungen erben.

Wenn Sie nicht mit neuen Buildern basteln möchten, empfehle ich die Verwendung von @Named("activity") und @Named("fragment") Annotation, um den Typ des Berechtigungshandlers anzugeben, den Sie injizieren möchten. Sie müssen es in Ihr annotiertes Feld @Inject und auf die annotierte Methode @Provides setzen.

+0

Danke für die Antwort, ich habe das gleiche wie Sie gestern vorgeschlagen, funktioniert gut – CROSP