android - Dagger2 注入未发生 - 注入的字段结果为空
问题描述
我正在为我的第一个 Dagger2 项目而苦苦挣扎。
我想将 Context 注入单例类。这是一个最小的示例(我删除了包名称、导入并且没有包含布局、值或清单文件)。理想情况下,此代码应选择字符串<string name="app_name">My Application</string>
。
MainApplication.java:
public class MainApplication extends Application {
private MainComponent mComponent;
@Override
public void onCreate() {
super.onCreate();
mComponent = DaggerMainComponent.builder()
.mainModule(new MainModule(this))
.build();
getComponent().inject(this);
}
public MainComponent getComponent() {
return mComponent;
}
}
主模块.java:
@Module
public class MainModule {
private final MainApplication mApplication;
public MainModule(MainApplication application) {
this.mApplication = application;
}
@Provides
@Singleton
public Context getApplicationContext() {
return mApplication.getApplicationContext();
}
}
主要组件.java:
@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainApplication application);
}
MainActivity.java:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvAppName = findViewById(R.id.main_app_name);
tvAppName.setText(MainHelper.getInstance().getApplicationName());
}
}
MainHelper.java:
public class MainHelper {
private static final MainHelper INSTANCE = new MainHelper();
@Inject
Context mContext;
public static MainHelper getInstance() {
return INSTANCE;
}
public String getApplicationName() {
return mContext.getString(R.string.app_name);
}
}
实际发生的是,我在应用程序启动时遇到了这个异常:
2019-11-14 18:46:47.561 9116-9116/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 9116
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapplication/com.example.myapplication.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getString(int)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2830)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2909)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1606)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getString(int)' on a null object reference
at com.example.myapplication.MainHelper.getApplicationName(MainHelper.java:21)
at com.example.myapplication.MainActivity.onCreate(MainActivity.java:16)
at android.app.Activity.performCreate(Activity.java:6984)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1235)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2783)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2909)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1606)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6592)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)
基本上,in 中的mContext
对象MainHelper
是 null,这对我来说意味着注入根本不起作用。出了什么问题?这段代码似乎遵守了几乎所有的教程。
解决方案
您没有Context
将MainHelper
. 我建议您重构您的MainHelper
类以通过构造函数注入获取上下文(您应该为您拥有的所有类执行此操作):
@Singleton
public class MainHelper {
private final Context context;
@Inject
public MainHelper(Context context) {
this.context = context;
}
}
构造函数上的@Inject
注释应该足以让 Dagger 知道MainHelper
为您实例化/创建。然后为了将这个MainHelper
类注入到MainActivity
你的MainActivity
. MainApplication
你已经为你的班级做了类似的事情:
@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainApplication application);
void inject(MainActivity activity);
}
然后在你的 上,你通过调用Dagger 为你生成的方法MainActivity
注入:MainHelper
inject
public class MainActivity extends AppCompatActivity {
@Inject
MainHelper helper;
@Override
protected void onCreate(Bundle savedInstanceState) {
((CustomApplication) getApplication()).getComponent().inject(this);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvAppName = findViewById(R.id.main_app_name);
tvAppName.setText(helper.getApplicationName());
}
}
推荐阅读
- sql - 如何在postgres中测量空间列上的表簇?
- security - 关于在本地存储中加密和存储 JWE 令牌以供以后在安全的 http 请求中重用
- compression - 请求基于流的解压
- python - 我如何从 python 替换这些案例
- c - LNK2019 错误:检查此代码的错误
- c - 在 C 中进行字符输入时,for 循环运行的次数更少
- javascript - 为什么我在 SVG 上无法读取 null 的属性“tagName”?
- pytorch - AssertionError:无法从数据中推断损失函数,请传递损失函数
- database - 来自数据库的 ASP.NET Core 枚举本地化
- opencv - 如何在重复结构图像中使用互相关来找到图像的变化?