Сбой Dagger2 на setText при вызове ViewModel - PullRequest
0 голосов
/ 10 апреля 2019

Приложение компилируется, но вылетает во время выполнения с нулевой ссылкой на объект.Я пытался отладить его, но не могу найти ошибку, но я знаю, что если я удалю setText в textview, который вызывает метод для извлечения String, который затем отображается в MainActivity через фрагмент (если я удаляю это без сбоев)что приводит меня к мысли, что мой нулевой объект связан с тем, как я не создал экземпляр модели представления.Неуверен в том, как это сделать.

попытался удалить и найти bufg из stacktrace, в котором говорится, что нулевая ссылка на объект находится в 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 Link - https://github.com/BenMohammad/LearnDagger-STAGE_2-with-dagger-better

Должен вызвать метод getConnection () в viewModel и получить строку и отобразить фрагмент, который был добавлен в MainActivity.

Спасибо

Ответы [ 4 ]

3 голосов
/ 10 апреля 2019

Вы не выполнили внедрение зависимостей в этом представлении. Это может быть:

AndroidSupportInjection.inject(this);

или:

((YourApplicationClass) getActivity().getApplication()).getApplicationComponent().inject(this);

(если вы не используете Dagger для Android) в вашем методе onCreate.

В этом случае, Dagger будет знать, что у него есть некоторые зависимости, которые нужно вставить в этот фрагмент, в вашем случае HomeViewModel. В противном случае HomeViewModel будет по-прежнему нулевым, пока вы не выполните DI

2 голосов
/ 10 апреля 2019

ОК. Думаю, ответы (включая мои) смутили вас больше, чем вы.

Модель представления должна быть инициализирована следующим образом (я не знаю, что находится в вашем модуле, но это правильноway): в методе onCreate go:

HomeViewModel homeviewModel = ViewModelProviders.of(this).get(HomeViewModel.class);

Если вам нужно передать зависимости вашей модели представления, пожалуйста, используйте ViewModel Factory.Google или просто обратитесь к этой ссылке

2 голосов
/ 10 апреля 2019

Вы не внедрили HomeViewModel в свой фрагмент.попробуйте использовать AndroidSupportInjection.inject(this); в вашем onCreate методе.метод должен выглядеть следующим образом

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    AndroidSupportInjection.inject(this);
}
0 голосов
/ 10 апреля 2019

Вы пытаетесь найти tv_frag в родительской активности, а не текущий фрагмент.

Изменить на:

tvFrag = getView().findViewById(R.id.tv_frag);
tvFrag.setText(homeViewModel.getConnection());
...