2015-10-12 19 views
5

Tôi luôn nhận ngoại lệ con trỏ null khi cố gắng chèn giao diện vào lớp triển khai. đây là mã của tôi:Dagger 2 - Giao diện tiêm trong lớp thực hiện - "Cố gắng gọi phương thức giao diện trên tham chiếu đối tượng rỗng"

Bắt:

Nullpointer lỗi trong LoginManagerImpl lớp tại dòng:
@ Override
public String getLoginResponse (String yêu cầu) {
trở networkManager.getLoginResponse (theo yêu cầu) ;
}

đây NetworkManager luôn là null, bạn có thể xin vui lòng xem xét các mã.

Dưới đây là mã nguồn của tôi:

public class LoginActivity extends Activity { 

    @Inject 
    NetworkManager networkManager; 

    @Inject 
    LoginManager loginManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getApplicationComponent().inject(this); 

     loginManager.getLoginResponse("valid Login Request"); 
    } 
} 

public interface NetworkManager 
{ 
    String getLoginResponse(String request); 
    String getUserDetailResponse(String request); 
    String getABCResponse(String request); 
} 

public interface LoginManager 
{ 
    String getLoginResponse(String request); 
} 

public class LoginManagerImpl implements LoginManager { 
    @Inject 
    NetworkManager networkManager; 

    public LoginManagerImpl(Context context) 
    { 

    } 

    @Override 
    public String getLoginResponse(String request) { 
     return networkManager.getLoginResponse(request); 
    } 
} 

public class NetworkManagerImpl implements NetworkManager { 

    public NetworkManagerImpl(Context context) 
    { 

    } 
    @Override 
    public String getLoginResponse(String request) { 
     return "valid login response fetched from server"; 
    } 

    @Override 
    public String getUserDetailResponse(String request) { 
     return "valid user deails"; 
    } 

    @Override 
    public String getABCResponse(String request) { 
     return "valid ABC request response"; 
    } 
} 

@Module 
public class AppModule { 

    DaggerApplication application; 

    public AppModule(DaggerApplication application) { 
     this.application = application; 
    } 

    @Provides 
    @Singleton 
    DaggerApplication provideDaggerApplication() { 
     return application; 
    } 

    @Provides 
    @Singleton 
    public Context provideApplicationContext() 
    { 
     return application.getApplicationContext(); 
    } 

    @Provides 
    @Singleton 
    public LoginManager providesLoginManager(Context context) 
    { 
     return new LoginManagerImpl(); 
    } 

    @Provides 
    @Singleton 
    public LoyaltyCardManager providesLoyaltyCardManager(Context context) 
    { 
     return new LoyaltyCardManagerImpl(context); 
    } 

    @Provides 
    @Singleton 
    public NetworkManager providesNetworkManager(Context context) 
    { 
     return new NetworkManagerImpl(context); 
    } 
} 

@Singleton 
@Component(
     modules = { 
       com.dagger.component.AppModule.class 
     }) 
public interface ApplicationComponent { 
    void inject (LoginActivity activity); 

    NetworkManager getNetworkManager(); 
    LoginManager getLoginManager(); 
} 

Trả lời

4

Có hai cách để bạn có thể để cho Dagger tiêm phụ thuộc như các lĩnh vực networkManager vào LoginManagerImpl.

  1. Chú thích constructor của nó với @Inject và thay đổi providesLoginManager(Context) để

    @Provides @Singleton 
    LoginManager providesLoginManager(LoginManagerImpl manager) { 
        return manager; 
    } 
    

    Điều đó sẽ có nghĩa là Dagger sẽ cung cấp LoginManagerImpl, và phương pháp @Provides của bạn liên kết với LoginManager đó.

  2. Nếu bạn muốn nhanh chóng LoginManagerImpl mình trong providesLoginManager(Context), sau đó cũng yêu cầu một MembersInjector<LoginManagerImpl> và sử dụng nó để tiêm các lĩnh vực như networkManager:

    @Provides @Singleton 
    LoginManager providesLoginManager(Context context, MembersInjector<LoginManagerImpl> membersInjector) { 
        LoginManagerImpl manager = new LoginManagerImpl(context); 
        membersInjector.injectMembers(manager); 
        return manager; 
    } 
    

Ví dụ của bạn, tôi khuyên bạn nên lựa chọn # 1 . Sử dụng MembersInjector thực sự hữu ích cho các lớp học mà bạn không thể cho phép Dagger khởi tạo, như Hoạt động trên Android.

0

Chèn trường không tự động. Bạn cần phải cung cấp những phụ thuộc đó thông qua hàm tạo, hoặc bạn cần phải tự khởi tạo việc tiêm trường trong hàm tạo.

public class LoginActivity extends Activity {  
    @Inject 
    NetworkManager networkManager; 

    @Inject 
    LoginManager loginManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     getApplicationComponent().inject(this); 

     loginManager.getLoginResponse("valid Login Request"); 
    } 
} 

public interface NetworkManager 
{ 
    String getLoginResponse(String request); 
    String getUserDetailResponse(String request); 
    String getABCResponse(String request); 
} 

public interface LoginManager 
{ 
    String getLoginResponse(String request); 
} 

public class LoginManagerImpl implements LoginManager { 
    @Inject 
    NetworkManager networkManager; 

    public LoginManagerImpl(Context context) {  

     ((DaggerApplication)context).getApplicationComponent().inject(this); 
    } 

    @Override 
    public String getLoginResponse(String request) { 
     return networkManager.getLoginResponse(request); 
    } 
} 

public class NetworkManagerImpl implements NetworkManager { 

    public NetworkManagerImpl(Context context) 
    { 
     ((DaggerApplication)context).getApplicationComponent().inject(this);  } 
    @Override 
    public String getLoginResponse(String request) { 
     return "valid login response fetched from server"; 
    } 

    @Override 
    public String getUserDetailResponse(String request) { 
     return "valid user deails"; 
    } 

    @Override 
    public String getABCResponse(String request) { 
     return "valid ABC request response"; 
    } 
} 

@Module 
public class AppModule { 

    DaggerApplication application; 

    public AppModule(DaggerApplication application) { 
     this.application = application; 
    } 

    @Provides 
    @Singleton 
    DaggerApplication provideDaggerApplication() { 
     return application; 
    } 

    @Provides 
    @Singleton 
    public Context provideApplicationContext() 
    { 
     return application.getApplicationContext(); 
    } 

    @Provides 
    @Singleton 
    public LoginManager providesLoginManager(Context context) 
    { 
     return new LoginManagerImpl(); 
    } 

    @Provides 
    @Singleton 
    public LoyaltyCardManager providesLoyaltyCardManager(Context context) 
    { 
     return new LoyaltyCardManagerImpl(context); 
    } 

    @Provides 
    @Singleton 
    public NetworkManager providesNetworkManager(Context context) 
    { 
     return new NetworkManagerImpl(context); 
    } 
} 

@Singleton 
@Component(
     modules = { 
       com.dagger.component.AppModule.class 
     }) 
public interface ApplicationComponent { 
    void inject(LoginManagerImpl loginManagerImpl); 
    void inject(NetworkManagerImpl networkManagerImpl); 
    void inject (LoginActivity activity); 

    NetworkManager getNetworkManager(); 
    LoginManager getLoginManager(); 
} 

Hoặc bạn phải cung cấp cho họ trên danh sách đối số nhà xây dựng

@Provides 
    @Singleton 
    public LoginManager providesLoginManager(Context context, NetworkManager networkManager) 
    { 
     return new LoginManagerImpl(context, networkManager); 
    } 
0

tôi đã có thể giải quyết các lỗi bằng cách thêm android:name="my_application_class_name" cho thẻ ứng dụng trong tập tin AndroidManifest.

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