tutorial inyeccion injection for dummies dependencias component android dependency-injection kotlin dagger-2 dagger

android - inyeccion - Error de Kotlin: Dagger no admite la inyección en campos privados



kotlin mvp dagger 2 retrofit (7)

¿Ha definido fun inject(fragment: KotlinFragment) en su ApplicationComponent ? Porque parece que su mensaje de error está diciendo exactamente eso.

EDITAR: tal vez no haya proporcionado SharedPreferences en su módulo de esta manera:

@Module public class AndroidModule { private final TimrApplication application; public AndroidModule(TimrApplication application) { this.application = application; } @Provides SharedPreferences provideSharedPreferences(){ return PreferenceManager.getDefaultSharedPreferences(application); } }

Uso en la actividad de kotlin ViewPager y quiero que en el fragmento Kotlin use la inyección de daga. Tengo error: Dagger no admite la inyección en campos privados. En Java Fragmento el trabajo de inyección de daga. ¿Por qué no puedo inyectar la daga en el faragment kotlin?

en mi actividad kotlin

mPagerAdapter = object : FragmentPagerAdapter(supportFragmentManager) { private val mFragments = arrayOf(KotlinFragment(), JavaFragment()) private val mFragmentNames = arrayOf(getString(R.string.cashdocuments), getString(R.string.action_absmysql)) override fun getItem(position: Int): Fragment { return mFragments[position] } override fun getCount(): Int { return mFragments.size } override fun getPageTitle(position: Int): CharSequence { return mFragmentNames[position] } }

mi fragmento de kotlin

class KotlinFragment : Fragment() { @Inject internal var mSharedPreferences: SharedPreferences? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) (activity.application as SamfantozziApp).dgaeacomponent().inject(this) } override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? { super.onCreateView(inflater, container, savedInstanceState) val rootView = inflater!!.inflate(R.layout.activity_absserver, container, false) return rootView } }

mensajes gradle build


Accidentalmente me topé con mi propia respuesta y debo confesar que, de hecho, no está funcionando (al menos para mi caso de uso). Por favor, considere la respuesta de Avilio, que también funcionó para mí: sustitúyalo internal con lateinit .

Vieja respuesta

Eliminar modificador internal . Dagger necesita al menos un paquete de acceso privado para acceder al campo anotado. En Kotlin, internal modificador internal no es una sustitución del modificador de acceso privado del paquete de Java.

Para obtener una explicación detallada de las diferencias entre los modificadores en Java y Kotlin, consulte el episodio nº 101 del podcast fragmentado: "Aprendizaje de Kotlin: modificadores de visibilidad, modificadores internos, módulos" , así como los documentos oficiales .


Así de simple puedes hacer esto, cambia esta línea.

@Inject internal var mSharedPreferences: SharedPreferences? = null

A

@set:Inject internal var mSharedPreferences: SharedPreferences? = null

Esto funciona como encanto en mi caso.


Retire el modificador internal . Y también tuve que declarar lateinit y eliminar el opcional.


Te has equivocado aquí:

@Inject internal var mSharedPreferences: SharedPreferences? = null

Esto parece que agregó la anotación @Inject a la clase KotlinFragment

Por favor, cambia esto y funcionará:

var mSharedPreferences: SharedPreferences? = null @Inject set

Aquí está el enlace a la documentación: https://kotlinlang.org/docs/reference/annotations.html


Tuve el mismo error, incluso al eliminar la palabra clave interna. Así que sustituí interno por lateinit y funcionó.


@Inject lateinit var mSharedPreferences: SharedPreferences

Además, esto funcionó para mí también para la variable de inicialización tardía