【问题标题】:Android Dagger 2 and clean architecture implementation, scope errorsAndroid Dagger 2 和干净的架构实现,范围错误
【发布时间】:2017-10-02 13:17:59
【问题描述】:

我正试图弄清楚如何使用 dagger 2 处理依赖注入并在 Android 中使用干净的架构。我想要实现的是当我单击一个按钮时,一条消息将保存到 Firebase 数据库。并向用户显示成功消息。当我构建我的项目时,我收到了这个错误:

错误:(10, 1) 错误:com.example.mvpsample.home.HomeComponent (无范围的)可能不引用范围绑定:@Provides @Singleton com.google.firebase.database.FirebaseDatabase com.example.mvpsample.data.DataModule.provideFirebaseDatabase()

这是我的应用类:

public class MyApp extends Application {

    private static MyApp app;
    private HomeComponent homeComponent;
    private AuthenticationComponent authenticationComponent;

    @Inject
    Presenter presenter;

    @Override
    public void onCreate() {
        super.onCreate();
        app = this;

        homeComponent = DaggerHomeComponent
                .builder()
                .homeModule(new HomeModule(presenter.getView()))
                .build();
    }

    public HomeComponent getHomeComponent() {
        return homeComponent;
    }

    public static MyApp app() {
        return app;
    }
}


家庭活动

public class HomeActivity extends AppCompatActivity implements BaseContract.View {

    @Inject
    public Presenter presenter;

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

        MyApp
                .app()
                .getHomeComponent()
                .inject(this);

    }

    @OnClick(R.id.tvHello)
    public void clickTvHello() {
        presenter.writeStringToDatabase("Hi");
    }


    @Override
    public void showSuccessMessage() {
        Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show();
    }
}


主页模块

@Module
public class HomeModule {

    private final BaseContract.View View;

    @Inject
    public HomeModule(BaseContract.View View) {
        this.View = View;
    }

    @Provides
    public BaseContract.View provideView() {
        return View;
    }
}


主页组件

@Component(modules = {HomeModule.class, DataModule.class})
public interface HomeComponent {
    void inject(HomeActivity homeActivity);
}


数据模块

@Module
public class DataModule {

    @Provides
    @Singleton
    public FirebaseDatabase provideFirebaseDatabase() {
        return FirebaseDatabase.getInstance();
    }
}


基础合同

public interface BaseContract {
    interface View {
        void showSuccessMessage();
    }

    interface Presenter {

        View getView();

        void writeStringToDatabase(String string);
    }
}


演示者

public class Presenter implements BaseContract.Presenter {

    private final BaseContract.View View;

    @Inject
    FirebaseDatabase firebaseDatabase;

    @Inject
    public Presenter(BaseContract.View View) {
        this.View = View;
    }


    @Override
    public BaseContract.View getView() {
        return View;
    }

    @Override
    public void writeStringToDatabase(String string) {
        firebaseDatabase.getReference()
                .child("messages")
                .push()
                .child("value")
                .setValue(string).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                getView().showSuccessMessage();
            }
        });
    }
}


我遵循了示例项目和教程,但不明白我在这里做错了什么。不是在寻找工作项目,但我想了解什么是最佳实践以及如何管理和使用模块和组件。

【问题讨论】:

    标签: android dependency-injection firebase-realtime-database dagger-2 clean-architecture


    【解决方案1】:

    问题是您的HomeComponent 没有作用域,而您的DataModule 提供了作用域依赖项(即FirebaseDatabase 依赖项)。

    非作用域组件不能依赖作用域提供程序。您要么必须删除 provideFirebaseDatabase() 提供程序上的 @Singleton,要么在 HomeComponent 上添加 @Singleton

    【讨论】:

    • 我在此块中收到 getView() 空引用错误:homeComponent = DaggerHomeComponent .builder() .homeModule(new HomeModule(presenter.getView())) .build();你有什么想法吗?
    • 试试homeComponent = DaggerHomeComponent.builder().homeModule(new HomeModule(this)).build();
    猜你喜欢
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2020-02-17
    • 2018-10-09
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多