डैगर 2.2 घटक बिल्डर मॉड्यूल विधि पदावनत


81

मैंने डैगर 2.2 का उपयोग करना शुरू कर दिया और घटक बिल्डर में मॉड्यूल विधियों को हटा दिया गया है।

यह मेरा अनुप्रयोग घटक है:

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

और अनुप्रयोग मॉड्यूल:

@Module
public class ApplicationModule {
    Application application;

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

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

यहाँ उत्पन्न वर्ग है:

@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;
    }
  }
}

मैं घटक को कैसे प्रारंभ करूँ अगर ComponentBuilder के साथ नहीं?

जवाबों:


181

आपको इस बात का विवरण पढ़ना चाहिए कि यह पदावनत क्यों है। यदि आप IntelliJ या Android Studio जैसी IDE का उपयोग कर रहे हैं, तो आप बस विधि का चयन कर सकते हैं और विंडोज पर जावेदोक को अपग्रेडेशन नोटिस सहित पढ़ने के लिए Control+ हिट कर Qसकते हैं।

जावदोक पढ़ता है:

@deprecated यह मॉड्यूल घोषित किया गया है, लेकिन घटक में एक उदाहरण का उपयोग नहीं किया जाता है। यह तरीका नो-ऑप है। अधिक के लिए, https://google.github.io/dagger/unused-modules देखें

और इस लिंक से आप देख सकते हैं:

जब डैगर प्रोसेसर घटकों को उत्पन्न करता है, तो इसे केवल मॉड्यूल और घटक निर्भरता के उदाहरणों की आवश्यकता होती है, जो एक बंधन के लिए अनुरोधों की आपूर्ति करने के लिए स्पष्ट रूप से आवश्यक होते हैं।

  • यदि मॉड्यूल में उपयोग किए जाने वाले सभी मॉड्यूल स्थिर हैं, तो डैगर को उस मॉड्यूल की आवृत्ति की आवश्यकता नहीं है। डैगर बिना किसी मॉड्यूल के सीधे स्टैटिक विधियों को लागू कर सकता है।
  • यदि कोई मॉड्यूल किसी घटक के लिए कोई बाइंडिंग प्रदान नहीं करता है, तो ग्राफ़ का निर्माण करने के लिए उस मॉड्यूल का कोई उदाहरण आवश्यक नहीं है।

यह कहना सुरक्षित है कि आप केवल डिप्रेसेशन को अनदेखा कर सकते हैं। यह अप्रयुक्त तरीकों और मॉड्यूल के बारे में आपको सूचित करना है। जैसे ही आपको वास्तव Applicationमें अपने सबग्राफ में कहीं न कहीं / उपयोग की आवश्यकता होती है , मॉड्यूल की आवश्यकता होने वाली है, और डिप्रेशन चेतावनी दूर हो जाएगी।


75
स्कैन उत्तर, हिट कमांड + क्यू, एंड्रॉइड स्टूडियो बंद हो जाता है। दिमाग चालू करो, वापस आओ, जवाब फिर से पढ़ें।
206 पर Bri6ko

4
Ctrl + J जिस तरह से। Ctrl + Q ट्रोलिंग पर एक प्रयास है।
StarWind0

4
@StarWind कोई trolling इरादा, यह है विंडोज शॉर्टकट;)
डेविड Medenjak

2
वास्तव में समझ में नहीं आता, यह उत्तर सबसे अच्छा क्यों है?
गंभीर

2
@ वास्तव में, javadoc यह सब कहता है। यह केवल निरर्थक भागों के बारे में कुछ जानकारी है और, जैसा कि अंत में कहा गया है, आप इसे अनदेखा कर सकते हैं। मॉड्यूल का उपयोग करने वाले कोड को जोड़ते ही यह चला जाएगा।
डेविड मेडेंजाक

49

यह दर्शाया गया है क्योंकि आप अपने आवेदन में घटक और मॉड्यूल का उपयोग नहीं कर रहे हैं

@Inject
SomeObjectFromModule mSomeObject

यदि आप अपने अनुप्रयोगों में निर्भरता को इंजेक्ट नहीं कर रहे हैं, तो आपके घटक को शुरू करने का कोई फायदा नहीं है इसलिए कम से कम एक उपयोग के लिए डैगर लुक दें

एक बार जब आप इन पंक्तियों को किसी भी वर्ग में जोड़ते हैं, तो आप विचारों को इंजेक्ट करना चाहते हैं और फिर प्रोजेक्ट का निर्माण और पुनर्निर्माण कर सकते हैं और आपका पदच्युत हल हो जाएगा


5
यह स्वीकृत उत्तर होना चाहिए। इसके अलावा, इंजेक्शन के बाद "अपने प्रोजेक्ट को फिर से बनाना" न भूलें।
21

5

यह त्रुटि दिखाती है कि जब मेरे Moduleपास कोई @Providesविधि नहीं है या जो वस्तु उपलब्ध कराती Daggerहै उसका उपयोग ऐप में नहीं किया गया है।
हटाए गए मॉड्यूल को हटाने के लिए उदाहरण

मापांक

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

गतिविधि

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

या कंपोनेंट में

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

    void inject(SecondActivity activity);

    Book getBookTest();
}

3

मुझे मेजबान के साथ भी यही समस्या है और मैं चाहता हूं कि हर कोई जेनरेट किए गए घटक बिल्डर के मुद्दे पर पदावनत कर दे, क्योंकि उसे बचाने के लिए दो चीजों की जांच करनी चाहिए:

मॉड्यूल के लिए 1 / सही डैगर सिंटैक्स, घटक भी ध्यान से जांचें कि आप कहां इंजेक्ट करते हैं।

2 / आपके पास इंजेक्शन ऑब्जेक्ट (इंजेक्शन एनोटेशन और उसकी वस्तु) होना चाहिए, जिस स्थान पर आप इंजेक्षन करना चाहते हैं या फिर खंजर संकलक यह नहीं देख सकता है कि आपके मॉड्यूल का उपयोग कहां करना है इसलिए कुछ विधि को हटा दिया जाएगा। अपने इंजेक्शन स्थान पर कम से कम एक मॉड्यूल के इंजेक्शन को इंजेक्ट करें और कोड को फिर से संकलित करें, आपके पास अब वह मुद्दा नहीं होगा :)


1

यदि आप void inject(AppCompactActivity activity);घटक वर्ग में घोषणा करते हैं तो आपको मॉड्यूल विधि प्राप्त हो जाएगी । इसके बजाय आपको void inject(MainActivity activity);अपनी परियोजना का अनुसरण करने और पुनर्निर्माण करने के लिए तंग युग्मन का उपयोग करना होगा, जिसे आप देखेंगे, मॉड्यूल वर्ग में कोई पदावनत विधि नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.