Dagger2在调用ViewModel的setText上崩溃

时间:2019-04-10 05:57:47

标签: java android dagger android-viewmodel

应用程序已构建,但在运行时因空对象引用而崩溃。一直在尝试调试它,但是找不到错误,但是我知道,如果我在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";
}

}

StackTrace

GitHub链接-https://github.com/BenMohammad/LearnDagger-STAGE_2-with-dagger-better

应在viewModel中调用方法getConnection()并检索一个字符串并显示在已添加到MainActivity的片段上。

谢谢

4 个答案:

答案 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());