2015-03-22 17 views
9

Tôi đang cố gắng biên dịch https://github.com/svenjacobs/android-dagger2-example nhưng tôi đang gặp lỗi liên quan đến thành phần không được điều chỉnh tùy thuộc vào thành phần được sắp xếp. (Android Studio 1.1, Gradle 2.2.1). Ngoài ra nếu có ai biết về các ví dụ khác của Dagger2 Android VỚI FRAGMENTS tôi muốn biết về chúng.Thành phần Dagger2 (un-scoped) không thể phụ thuộc vào các thành phần phạm vi - Lỗi

UPDATE: Dưới đây là một ví dụ trong rất cơ bản với mảnh: https://github.com/gk5885/dagger-android-sample

/Users/Mac1/android-dagger2-example-master/app/src/main/java/com/svenjacobs/dagger2/ActivityComponent.java 
Error:(15, 1) error: com.svenjacobs.dagger2.ActivityComponent (unscoped) cannot depend on scoped components: 
@Singleton com.svenjacobs.dagger2.ApplicationComponent 
Error:Execution failed for task ':app:compileDebugJava'. 
> Compilation failed; see the compiler error output for details. 

Đây là ActivityComponent tập tin mà dường như không scoped:

import dagger.Component; 

/** 
* Component for all activities. 
* 
* @author Sven Jacobs 
*/ 
@Component(dependencies = ApplicationComponent.class, 
     modules = { 
       MainActivityModule.class, 
       AModule.class, 
       BModule.class 
     }) 
interface ActivityComponent extends AFragment.Injector, BFragment.Injector { 

    void inject(MainActivity activity); 

    void inject(AnotherActivity activity); 
} 

Và đây là thành phần scoped:

package com.svenjacobs.dagger2; 

import javax.inject.Singleton; 

import dagger.Component; 

/** 
* Application-wide dependencies. 
* 
* @author Sven Jacobs 
*/ 
@Singleton 
@Component(modules = ApplicationModule.class) 
interface ApplicationComponent { 

void inject(Dagger2Application application); 

/** 
* Provides dependency for sub-components 
*/ 
SomeApplicationDependency someApplicationDependency(); 
    } 

Trả lời

13

Bạn cần cung cấp một phạm vi cho ApplicationComponent. Điều này không nhất thiết phải là @Singleton, vì Dagger 2 cho phép bạn xác định phạm vi của riêng bạn bằng cách sử dụng chú thích @Qualifier trên giao diện.

@Scope 
public @interface CustomScopeName { 
} 

Bạn có thể sau đó sử dụng nó như vậy:

@CustomScopeName 
@Component(dependencies = ApplicationComponent.class, 
    modules = { 
      MainActivityModule.class, 
      AModule.class, 
      BModule.class 
    }) ....... 

Tôi nghĩ lý do bạn không được phép sử dụng một sự phụ thuộc scoped trong một thành phần unscoped là để ngăn chặn Singletons từ phụ thuộc vào phi Singleton các đối tượng và ngăn chặn các phụ thuộc tuần hoàn.

2

Đôi khi trong quá trình phát triển Dagger 2.0, hành vi đã được thay đổi và phạm vi thành phần trở nên nghiêm ngặt hơn. Xem this discussion. Bởi vì các dự án mẫu của tôi dựa vào việc phát hành SNAPSHOT của Dagger 2.0 nó đã phá vỡ.

Như atamakosi đã nói và cũng được giải thích là here khá tốt, bạn cần thêm phạm vi tùy chỉnh vào ActivityComponent, ví dụ: @PerActivity.

Các vấn đề liên quan