我创建了提供应用程序上下文的模块,我希望在模型层获得SharedPreferences
上下文。
我在Presenter层注入上下文,它使用SharedPreference
,但是当我移到模型层时,Dagger在Context
变量上注入一个null
值。
注入
@Inject
public Context mContext;
@Module
public class AppModule {
private App app;
public AppModule(App app){
this.app = app;
}
@Provides
public Context providesApp(){
return app.getApplicationContext();
}
}
public class App extends Application {
private AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.mainModule(new MainModule())
.build();
}
public AppComponent getAppComponent(){
return appComponent;
}
}
@Component(modules = {AppModule.class,MainModule.class})
public interface AppComponent {
void inject(MainActivity activity);
void inject(LoginActivity activity);
}
主模块
@Module
public class MainModule {
@Provides
public MainContract.Model providesMainModel(){
return new MainModel();
}
@Provides
public LoginContract.Model providesLoginModel(){
return new LoginModel();
}
}
由于应用程序模块中有上下文
,因此可以将上下文
作为参数添加到loginmodel
构造函数中。
@Provides
public LoginContract.Model providesLoginModel(Context contect){
return new LoginModel(contect);
}
@Provides
public LoginContract.Presenter providesLoginPresenter(LoginContract.Model model){
return new LoginPresenter(model);
}
但是请记住,为了便于测试,您必须只在活动和片段上使用Android
包。所以你的做法是错误的。
编辑
public class Preferences {
private final SharedPreferences preferences;
private String key;
private String defaultValue;
public StringPreferences(@NonNull SharedPreferences preferences) {
this.preferences = preferences;
}
@Nullable
public String get(String mykey) {
return preferences.getString(mykey, defaultValue);
}
public void set(@NonNull String mykey, @Nullable String value) {
preferences.edit().putString(mykey, value).apply();
}
// same way for integers, longs, doubles and booleans
public boolean isSet() {
return preferences.contains(key);
}
public void delete() {
preferences.edit().remove(key).apply();
}
}
@Provides
@Singleton
public SharedPreferences provideSharedPreferences(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context);
}
@Provides
@Singleton
public Preferences providePreferences(SharedPreferences prefs) {
return new Preferences(prefs);
}
@Provides
public LoginContract.Model providesLoginModel(Preferences prefs){
return new LoginModel(prefs);
}
@Provides
public LoginContract.Presenter providesLoginPresenter(LoginContract.Model model){
return new LoginPresenter(model);
}
我尝试使用avro-python3(向后兼容性)重新创建一个模式演变案例。 我有两个模式: 第二个模式没有字段,但有两个附加字段:和。 根据avro模式演化规则,如果我用schema_v1写入avro记录: …我可以使用schema_v2读取它,前提是不存在字段有默认值 但我得到了以下错误: 我知道这在Java中有效。这是一个视频课程的示例。有没有办法让它在python中工作?
我想写一篇文章在我的标题,但有一个字是一个像“链接”或“a”点击链接。标题只等待一个字符串。
问题内容: 在Python官方文档说,使用切片运算符和Python中的分配,使切片列表的浅表副本。 但是,例如,当我编写代码时: 当我写: 我得到不同的ID,并且追加一个列表不会反映在另一列表中。它不是在创建深拷贝,还是在我出问题的地方? 问题答案: 您正在创建 浅表 副本,因为嵌套值不会被复制,而只是被引用。一个 深 拷贝会建立一个列表中引用过的值的副本。 演示: 此处 嵌套的 字典不被复制;这
我按照TF初学者教程中的步骤创建了一个简单的分类模型。它们如下: 我保存了这个模型: 然后,我尝试使用这个TF教程为这个模型提供服务。我执行以下操作: 我试着这样称呼这个模型: 我收到以下错误: { “error”: “index = 1 不在 [0, 1)\n\t [[{{node StatefulPartitionedCall_51/StatefulPartitionedCall/sequen
问题内容: 可以说我有: 我有一个 ApplicationModule ,它需要为 Rec 和 Circle 提供实例: 和 ApplicationComponent : 以这种方式使用代码-无法编译。错误说 错误:(33,20)错误:形状被绑定多次。 对我来说,这是不可行的,因为该组件正试图找到一个实例,并且它找到了两个实例,因此它不知道要返回哪个实例。 我的问题是-我该如何处理? 问题答案:
//模块 //组件 `//预登录Presenter //预物流活动` //在一次创建中 //错误日志 错误:(18,53)错误:找不到符号类DaggerPresentComponent错误:(19,53)错误:找不到符号类DaggerUserLoginComponent错误:(19,10)错误:gorick.gradesprojectandroid.MVP. Presenter. Presente