¿Es una buena práctica usar @Inject para el Fragmento de Android en Dagger2?

Estoy usando @ContributesAndroidInjector of Dagger 2.11.

Funciona sin problemas con las siguientes fonts.
@ActivityScope también está funcionando.

 class MainActivity : AppCompatActivity(), HasFragmentInjector { @Inject lateinit var androidInjector: DispatchingAndroidInjector<Fragment> override fun fragmentInjector() = androidInjector @Inject lateinit var fragment: MainFragment @Inject lateinit var viewModel: MainViewModel override fun onCreate(savedInstanceState: Bundle?) { AndroidInjection.inject(this) super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) fragmentManager.beginTransaction() .replace(R.id.container, fragment) .commitAllowingStateLoss() viewModel.start("activity") } } class MainFragment @Inject constructor() : Fragment() { @Inject lateinit var viewModel: MainViewModel override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { val view = inflater!!.inflate(R.layout.fragment_main, container, false) return view } override fun onAttach(context: Context?) { super.onAttach(context) viewModel.start("fragment") } } @Module abstract class AndroidModule { @ActivityScope @ContributesAndroidInjector abstract fun contributeMainActivity(): MainActivity } @ActivityScope class MainViewModel @Inject constructor() { ... 

Pero cuando leí el documento , sentí que era correcto usar @ConstructsAndroidInjector así como también la actividad.

Y también en la respuesta aquí , está escrito como

 public class MainActivity { @Inject CoffeeFragment coffeeFragment; //no! don't do this @Inject TeaFragment teaFragment; //no! 

¿Es mi implementación problemática?
¿Qué problemas ocurrirán con mi implementación?

Los fragments son administrados por, bueno, el FragmentManager en Android.

En las subclasss de FragmentActivity , incluida AppCompatActivity , cuando se onSaveInstanceState(Bundle outBundle) en su Activity saveá el estado de sus Fragments.

Del onCreate(Bundle savedInstanceState) modo, onCreate(Bundle savedInstanceState) intentará restaurarlos. Puede hacer que esto suceda al activar Developer Options / Don't keep Activities y navegar dentro y fuera de su aplicación.

En esta situación, si solicita la inyección de su campo de Fragmento nuevamente utilizando Dagger 2, la Actividad hará reference a dos copys del Fragmento: el Fragmento restaurado y el nuevo inyectado. ¡No quieres esto! En cambio, la expresión correcta para manejar el Fragmento en su onCreate es la siguiente:

 fragment = fragmentManager.findFragmentByTag("MAIN") if (fragment == null) fragment = MainFragment.instantiate(null) fragmentManager.beginTransaction() .replace(R.id.container, fragment, "MAIN") .commit() 

donde MainFragment.instantiate(Bundle args) es un método estático en un companion object .

  • ¿Cómo crear una matriz Java en Kotlin para @PropertySource?
  • libGDX no puede realizar acción
  • Kotlin: ¿"eso" asignable?
  • No se puede enviar datos de formulario / múltiples con Volley
  • Kotlin - equivalencia a SomeClass.class para objects?
  • Comparar class de datos en Kotlin sin ID
  • Problemas al analizar datos con RxJava + Kotlin
  • Conflictos de guayaba cuando se usa kotlin-script-util (para soporte JSR-223) en una aplicación que usa gRPC
  • Kotlin + MVP: anulación accidental
  • Kotlin para con diferente incremento
  • Manera idiomática de invocar methods a través de la reflexión en Kotlin