Я очень новичок в Dagger2, только начинаю. Я хочу добиться чего-то подобного, но безуспешно.
Вот мой модуль
@Module
public class UtilModule
{
@Provides
@Named("fragmentUtilActivity")
public FragmentUtils providesFragmentUtilForActivity(Context context)
{
return new FragmentUtils(context);
}
@Provides
@Named("fragmentUtilFragment")
FragmentUtils providesFragmentUtilForFragment(Fragment fragment)
{
return new FragmentUtils(fragment);
}
}
А это мой компонент
@Component(modules = UtilModule.class)
public interface UtilComponent
{
@Named("fragmentUtilActivity")
FragmentUtils fragmentUtilsActivity(Context context);
@Named("fragmentUtilFragment")
FragmentUtils fragmentUtilsFragment(Fragment fragment);
}
А это мой FragmentUtil
класс
package myms.utils;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import javax.inject.Inject;
import myms.R;
public class FragmentUtils
{
private Context context;
private Fragment hostFragment;
public FragmentUtils(Context context)
{
this.context = context;
}
public FragmentUtils(Fragment hostFragment)
{
this.hostFragment = hostFragment;
}
public void addFragment(Fragment fragment, boolean addToBackStack)
{
FragmentTransaction transaction = ((Activity) context).getFragmentManager()
.beginTransaction();
transaction.add(R.id.fragment_container, fragment, null);
if(addToBackStack)
{
transaction.addToBackStack(null);
}
transaction.commit();
}
public void addNestedFragment(Fragment fragment, boolean addToBackStack)
{
FragmentTransaction transaction = hostFragment.getChildFragmentManager().beginTransaction();
transaction.add(R.id.nested_fragment_container, fragment, null);
if(addToBackStack)
{
transaction.addToBackStack(null);
}
transaction.commit();
}
public void replaceNestedFragment(Fragment fragment, boolean addToBackStack)
{
FragmentTransaction transaction = hostFragment.getChildFragmentManager().beginTransaction();
transaction.replace(R.id.nested_fragment_container, fragment, null);
if(addToBackStack)
{
transaction.addToBackStack(null);
}
transaction.commit();
}
}
Я хочу использовать экземпляр fragmentUtils с двумя разными реализациями: один для активности, а другой для фрагмента. Пожалуйста, помогите мне, что я делаю неправильно.
Также может кто-нибудь помочь мне понять цель void inject (SomeClass) в интерфейсе @Component.
С уважением
FragmentUtils
похоже, что должно быть 2 разных класса: один работает с фрагментом хоста, а другой работает с активностью. У вас есть 2 набора методов, и вызов неправильного приведет к исключению NullPointerException. Это действительно убедительный признак того, что этот код следует разделить на 2 разных класса. - person David Medenjak   schedule 03.07.2017FragmentUtils
? Похоже, что активность и фрагмент, которые их используют, должны иметь свой собственный модуль Dagger. НазваниеUtilModule
предполагает, что вы разделяете свои модули по типу того, что они предоставляют. Модули должны быть разделены в зависимости от объема того, что они предоставляют. - person Kevin Krumwiede   schedule 04.07.2017