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