Phương thức mô-đun trình tạo thành phần Dagger 2.2 không được dùng nữa


81

Tôi đã bắt đầu sử dụng dagger 2.2 và các phương thức mô-đun trong trình tạo Thành phần không được dùng nữa.

Đây là thành phần Ứng dụng của tôi:

@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
    void inject(Application application);
}

Và mô-đun Ứng dụng:

@Module
public class ApplicationModule {
    Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    @Singleton
    Application providesApplication() {
        return application;
    }
}

Đây là lớp được tạo:

@Generated(
  value = "dagger.internal.codegen.ComponentProcessor",
  comments = "https://google.github.io/dagger"
)
public final class DaggerApplicationComponent implements ApplicationComponent {
  private DaggerApplicationComponent(Builder builder) {
    assert builder != null;
  }

  public static Builder builder() {
    return new Builder();
  }

  public static ApplicationComponent create() {
    return builder().build();
  }

  @Override
  public void inject(Application application) {
    MembersInjectors.<Application>noOp().injectMembers(application);
  }

  public static final class Builder {
    private Builder() {}

    public ApplicationComponent build() {
      return new DaggerApplicationComponent(this);
    }

    /**
     * @deprecated This module is declared, but an instance is not used in the component. This method is a no-op. For more, see https://google.github.io/dagger/unused-modules.
     */
    @Deprecated
    public Builder applicationModule(ApplicationModule applicationModule) {
      Preconditions.checkNotNull(applicationModule);
      return this;
    }
  }
}

Làm cách nào để khởi tạo thành phần nếu không phải với ComponentBuilder?

Câu trả lời:


180

Bạn nên đọc mô tả lý do tại sao nó không được dùng nữa. Nếu bạn đang sử dụng IDE như IntelliJ hoặc Android Studio, bạn có thể chỉ cần chọn phương pháp và nhấn Control+ Qtrên Windows để đọc Javadoc bao gồm cả thông báo ngừng sử dụng.

Javadoc đọc:

@deprecated Mô-đun này được khai báo, nhưng một thể hiện không được sử dụng trong thành phần. Phương pháp này là không-op. Để biết thêm, hãy xem https://google.github.io/dagger/unused-modules .

Và từ liên kết này, bạn có thể thấy:

Khi bộ xử lý Dagger tạo ra các thành phần, nó chỉ yêu cầu các phiên bản của mô-đun và các thành phần phụ thuộc rõ ràng cần thiết để cung cấp các yêu cầu cho một ràng buộc.

  • Nếu tất cả các phương thức của mô-đun được sử dụng trong thành phần là tĩnh, thì Dagger không cần một phiên bản của mô-đun đó. Dagger có thể gọi các phương thức tĩnh trực tiếp mà không cần mô-đun.
  • Nếu một mô-đun không cung cấp ràng buộc cho một Thành phần, thì không cần thực hiện phiên bản nào của mô-đun đó để xây dựng biểu đồ.

Thật an toàn khi nói rằng bạn có thể bỏ qua việc không dùng nữa. Nó nhằm mục đích thông báo cho bạn về các phương pháp và mô-đun không sử dụng. Ngay khi bạn thực sự yêu cầu / sử dụng Applicationở đâu đó trong đồ thị con của mình, mô-đun sẽ cần thiết và cảnh báo không dùng nữa sẽ biến mất.


73
Quét câu trả lời, nhấn lệnh + Q, Android Studio sẽ tắt. Bật não, quay lại, đọc lại câu trả lời.
Bri6ko

4
Nhân tiện, Ctrl + J. Ctrl + Q là một nỗ lực để trolling.
StarWind0

4
@StarWind Không có ý định trolling, đây phím tắt của Windows;)
David Medenjak

2
Thực sự không hiểu, tại sao câu trả lời này là tốt nhất?
Sever

2
@Sever Chính xác, javadoc nói lên tất cả. Đó chỉ là một số thông tin về các bộ phận thừa và như đã nói ở phần cuối, bạn có thể bỏ qua nó. Nó sẽ biến mất khi bạn thêm mã sử dụng mô-đun.
David Medenjak

49

Nó hiển thị không được dùng nữa vì bạn không sử dụng Thành phần và mô-đun trong ứng dụng của mình bởi

@Inject
SomeObjectFromModule mSomeObject

nếu bạn không đưa các phụ thuộc vào các ứng dụng của mình, thì không có việc khởi tạo thành phần của bạn, vì vậy dagger hãy tìm kiếm ít nhất một cách sử dụng

khi bạn thêm các dòng này vào bất kỳ lớp nào bạn muốn đưa các chế độ xem và sau đó xây dựng và xây dựng lại dự án sạch sẽ và việc bạn không dùng nữa sẽ được giải quyết


5
Nó phải là câu trả lời được chấp nhận. Ngoài ra, đừng quên "Xây dựng lại dự án của bạn" sau khi tiêm.
sokarcreative

4

Nó hiển thị lỗi khi Modulekhông có @Providesphương thức của tôi hoặc đối tượng được cung cấp bởi Daggerkhông được sử dụng trong ứng dụng.
Ví dụ để xóa mô-đun không dùng nữa

Mô-đun

@Module
public class SecondActivityModule {
    @Provides
    Book provideBookTest() {
        return new Book();
    }
}

Hoạt động

public class SecondActivity extends AppCompatActivity {
    @Inject
    Book test;
    ...
}

HOẶC trong Thành phần

@Component(modules = SecondModule.class)
public interface SecondComponent {

    void inject(SecondActivity activity);

    Book getBookTest();
}

3

Tôi gặp sự cố tương tự với máy chủ lưu trữ và tôi chỉ muốn mọi người đã gặp sự cố không được chấp nhận trên lớp trình tạo thành phần đã tạo nên kiểm tra hai điều để tiết kiệm thời gian:

1 / Đúng cú pháp dagger cho module, component cũng kiểm tra kỹ nơi bạn tiêm.

2 / Phải có đối tượng tiêm (chèn chú thích và đối tượng của nó) ở vị trí bạn muốn tiêm, nếu không trình biên dịch dao găm không thể thấy nơi sử dụng mô-đun của bạn, vì vậy một số phương pháp sẽ không được dùng nữa. Chỉ cần đưa ít nhất một mô-đun cung cấp vào nơi tiêm của bạn và biên dịch lại mã, bạn sẽ không gặp vấn đề đó nữa :)


1

bạn sẽ nhận được phương thức mô-đun không được chấp nhận nếu bạn khai báo void inject(AppCompactActivity activity);trong lớp thành phần. thay vì bạn phải sử dụng khớp nối chặt chẽ như sau void inject(MainActivity activity);và xây dựng lại dự án của bạn, bạn sẽ thấy, không có phương thức không được chấp nhận trong lớp mô-đun

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.