2014-11-09 4 views
37

В настоящее время я пытаюсь добавить Кинжал в мои проекты андроида. Для проектов приложений это легко и понятно для меня, как построить ObjectGraph. Но я не совсем понимаю, что это лучший способ сделать это в моих проектах библиотеки Android.Как использовать кинжал в проекте библиотеки андроида

Должен ли я продолжать создавать ObjectGraph в классе приложений приложений и передавать OG на LibraryModule - plinging OG библиотеки в OG Apps? Или я должен построить весь ObjectGraph в библиотеке?

Что делать, если мне нужно ввести класс в библиотеку по ObjectGraph.inject(this)? В моих проектах приложений я могу получить OG из класса Application. Но как справиться с этим в библиотеке? Должен ли я добавить метод @Provides для ObjectGraph?

Большое спасибо за помощь.

Редактировать: Вкратце: Как я могу позвонить ObjectGraph.inject(this) в моем проекте библиотеки, где у меня нет доступа к OG, потому что он строится в классе приложений?

+3

У меня также есть этот вопрос ... Кто-нибудь действительно знает, как это сделать? – mato

+0

@sebastian Вы решили свою проблему? если да, то опубликуйте свое решение .. – Sachin

+1

Я застрял для этого в кинжале 2 – conca

ответ

21

В случае, если кто-то с помощью Dagger 2 получает здесь, это то, как я сделал в моем приложении:

В модуле библиотеки я создал следующий модуль и компонент:

@Module 
public class ModuleUtil { 

    @Provides 
    public RestTemplate provideRestTemplate() { 
     return new RestTemplate(); 
    } 

} 

@Singleton 
@Component(
     modules = { 
       ModuleUtil.class 
     }) 
public interface MainComponent { 
    void inject(Postman postman); 
} 

И тогда я создал Singleton ниже, для того, чтобы управлять инъекции:

public class DaggerWrapper { 

    private static MainComponent mComponent; 

    public static MainComponent getComponent() { 
     if (mComponent == null) { 
      initComponent(); 
     } 
     return mComponent; 
    } 

    private static void initComponent() { 
     mComponent = DaggerMainComponent 
       .builder() 
       .utilModule(new ModuleUtil()) 
       .build(); 
    } 
} 

Когда некоторые CLA ss из библиотечного модуля необходимо ввести своих членов, я просто вызываю DaggerWrapper.getComponent().inject(this);, и это не так.

+0

Я понимаю, что DaggerWrapper также находится в вашем библиотечном модуле, и его можно получить из вашего модуля приложения. Это верно? –

+0

Кажется, это лучший ответ, потому что он ничего не требует приложения (клиент библиотеки). –

+0

Работает ли кто-нибудь? Последовал тот же процесс, но не работал. При создании приложения я получаю ошибку «не могу найти символ класса DaggerMainComponent». –

10

Я делаю это так:

  1. @Module классы принадлежат к основному проекту и они обеспечивают реализацию которых вы инъекционные к библиотечным элементам, поэтому нет никаких @Module классов в библиотеке проектов

  2. библиотеки элементы, которые ожидают зависимости должны иметь доступ к ObjectGraph и вызвать .inject() на себя, но основной проект должны дать экземпляр ObjectGraph в библиотеку с обеспеченной @Module зависимостью

  3. Как получить ObjectGraph из основного проекта в библиотеку? Вы могли бы иметь интерфейс, как это:

    interface Injector { 
        void inject(Object object); 
        public ObjectGraph getObjectGraph(); 
    }

Context объекты, такие как активность или класс Application реализует этот интерфейс (владельцы объектов ObjectGraph).

Если у вас есть пример деятельности в библиотечном модуле, который нужно что-то, чтобы впрыснуть от основного проекта, это будет выглядеть следующим образом:

class LibraryActivity extends Activity { 

    @Inject ActivationModule instance; 

    void onCreate(...) { 
     Injector injector = (Injector)getApplicationContext(); 
     injector.inject(this) 
    } 
} 

ActivationModule является класс/интерфейс в проекте библиотеки.

Главный проект имеет класс приложения, который реализует интерфейс инжектора и создает ObjectGraph с предоставленным dependecy для ActivationModule в проекте библиотеки.

class MyApplicationInTheMainProject extends Application implements Injector { 

    ObjectGraph graph; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     graph = ObjectGraph.create(new ActivationModuleImpl(this)); 
    } 

    @Override public void inject(Object object) { 
     graph.inject(object); 
    } 

    @Override public ObjectGraph getObjectGraph() { 
     return graph; 
    } 
} 


@Module(injects = { 
     LibraryActivity.class 
}, library = true) 
class ActivationModuleImpl implements ActivationModule { 
    .... 
} 
-3

Вот полный пример того, как использовать кинжал в приложении Шаг 1 Добавление depedancy проект уровня Gradle «com.neenbedankt.gradle.plugins пути к классам: Android-склонный: 1,8» Шага 2 Модуля уровня depedancy

применить плагин: '' com.android.application применить плагин: 'андроид-APT' применить плагин: 'com.neenbedankt.android-APT'

compile 'com.google.dagger:dagger:2.0' 
provided 'com.google.dagger:dagger-compiler:2.0' 
provided 'org.glassfish:javax.annotation:10.0-b28' 

Шаг 3 Построить Кинжал с классом приложения

общественного класса TubeMateApp расширяет Application {

public AppComponent component; 
public static TubeMateApp singleton; 


public static TubeMateApp getInstance() { 
    return singleton; 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
    singleton = this; 
    setupGraph(); 
} 

private void setupGraph() { 
    component = DaggerAppComponent.builder() 
      .appModule(new AppModule(this)) 
      .build(); 

    component.inject(this); 
} 


public AppComponent component() { 
    return component; 
} 

} Шаг 4 Создать AppModule как этот

@Module класса AppModule общественного {

private TubeMateApp app; 

public AppModule(TubeMateApp application) { 
    this.app = application; 
} 



@Provides 
public Application provideApplication() { 
    return app; 
} 

@Provides 
@Singleton 
Prefs prefs(){ 
    return Prefs.with(app); 
} 

// To use your custom requirement code here for example i have used Picasso with in the application 

@Provides 
@Singleton 
Picasso getPicasso(){ 
    return Picasso.with(app); 
} 

@Provides 
@Singleton 
LayoutInflater getLayoutInflater() { 
    return (LayoutInflater) app.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

} Шаг 5 Создание компонентов приложения который необходимо ввести dagger App Components here Шаг 6 Использования кинжал в основной деятельности выплеска how to apply dagger inject see this screenshot

+0

Вот полный пример использования кинжала в приложении –

+0

Оригинальный вопрос был о том, как использовать в проекте андроидной библиотеки. –

2

если вы даете эту библиотеку для людей, и они не ничего не знают о вашем сценарии, так что вы должны написать его таким образом, что ваш Кинжал прекрасно работает без каких-либо помощи от пользователя. (проще работать с лучшей практикой)

Я просто написал для вас некоторую библиотеку, чтобы показать, как это сделать. я написал библиотеку таким образом, что вы даже можете запустить ее отдельно и увидеть результат на вкладке сообщений. Пользователю вашей библиотеки оленьей кожи нужно не знать ничего о кинжале и ничего не делает, он просто использует библиотеку и кинжал будет настроен:

https://github.com/amirziaratii/libraryUsingDagger.git

если эта библиотекой является то, что вы используете его сам и для своего собственного проекта, лучше всего это сделать, как в этом проекте моего друга:

https://github.com/mmirhoseini/trakt.tv

отвеченных в этих двух проектах все ваши вопросы. задайте любой вопрос и больной ответ в комментарии.

Смежные вопросы