应用程序已构建,但在运行时因空对象引用而崩溃。一直在尝试调试它,但是找不到错误,但是我知道,如果我在textview上删除setText,它调用一种方法来检索一个String,然后通过一个片段在MainActivity中显示该字符串(如果我删除此崩溃,则不会崩溃)这使我相信我的null对象与我尚未实例化viewmodel的方式有关。不确定如何执行此操作。
尝试从stacktrace中删除bufg并找到其位置,该状态指出空对象引用位于片段的onActivityCreated中,但Dagger生成的代码使我迷路了,就好像我不运行它会生成任何内容,并且没有编译时错误。
public class HomeFragment extends Fragment {
@Inject
HomeViewModel homeViewModel;
TextView tvFrag;
public HomeFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v= inflater.inflate(R.layout.fragment_home, container, false);
return v;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
tvFrag = getActivity().findViewById(R.id.tv_frag);
tvFrag.setText(homeViewModel.getConnection()); //HERE
}
}
@FragmentScope
public class HomeViewModel extends ViewModel {
private DatabaseService databaseService;
private NetworkService networkService;
private NetworkHelper networkHelper;
@Inject
public HomeViewModel(DatabaseService ds, NetworkService ns, NetworkHelper nh){
this.databaseService = ds;
this.networkService = ns;
this.networkHelper = nh;
}
public String getConnection(){
return "Ben Mohammad Connected";
}
}
GitHub链接-https://github.com/BenMohammad/LearnDagger-STAGE_2-with-dagger-better
应在viewModel中调用方法getConnection()并检索一个字符串并显示在已添加到MainActivity的片段上。
谢谢
答案 0 :(得分:3)
您尚未在该视图中执行依赖项注入。可能是:
AndroidSupportInjection.inject(this);
或:
((YourApplicationClass) getActivity().getApplication()).getApplicationComponent().inject(this);
(如果您没有使用Dagger for Android),请使用onCreate
方法。
在这种情况下,Dagger将知道在该片段中将注入一些依赖项,在您的情况下为HomeViewModel
。否则,HomeViewModel
仍然为空,直到您执行DI
答案 1 :(得分:2)
您没有在片段中注入HomeViewModel
。
尝试在您的AndroidSupportInjection.inject(this);
方法中使用onCreate
。
方法应该看起来像这样
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidSupportInjection.inject(this);
}
答案 2 :(得分:2)
好吧,我认为答案(包括我的答案)比您更困惑您。
必须像这样初始化ViewModel(我不知道您的模块中有什么,但这是正确的方法):在onCreate
方法中,转到:
HomeViewModel homeviewModel = ViewModelProviders.of(this).get(HomeViewModel.class);
如果需要将依赖项传递给ViewModel,请使用ViewModel Factory。谷歌自己或只是参考this link
答案 3 :(得分:0)
您正在尝试在“父活动”中找到tv_frag
,而不是当前片段。
更改为:
tvFrag = getView().findViewById(R.id.tv_frag);
tvFrag.setText(homeViewModel.getConnection());