Question Erreur Kotlin: Dagger ne prend pas en charge l'injection dans des champs privés


J'utilise dans l'activité kotlin ViewPager et je veux dans Kotlin Fragment utiliser l'injection de poignard. J'ai une erreur: Dagger ne supporte pas l'injection dans des champs privés. En Java Fragment le travail d'injection de poignard. Pourquoi est-ce que je ne peux pas injecter le poignard dans le faragment de kotlin?

dans mon activité 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]
        }
    }

mon fragment 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
}

}

messages gradation construire

enter image description here


10
2017-11-08 19:03


origine


Réponses:


Accidentellement, je suis tombé sur ma propre réponse et je dois avouer que cela ne fonctionne pas (du moins pour mon cas d'utilisation). S'il vous plaît considérer La réponse d'Avilio qui a fonctionné pour moi aussi: substitut internal avec lateinit.


Vieille réponse

Retirer internal modificateur. Dagger nécessite au moins un accès privé au package pour accéder aux champs annotés. À Kotlin internal le modificateur est ne pas une substitution pour le modificateur d'accès privé à un package Java.

Pour une explication détaillée des différences entre les modificateurs de Java et de Kotlin, reportez-vous à la section sur les podcasts fragmentés. épisode # 101 - "Learning Kotlin - Modificateurs de visibilité, modificateur interne, modules", aussi bien que documents officiels.


15
2017-11-08 19:08



J'ai eu la même erreur, même en supprimant le mot-clé interne. J'ai donc remplacé interne avec en retard et ça a fonctionné.


16
2018-02-01 01:56



Vous avez une erreur ici:

    @Inject
internal var mSharedPreferences: SharedPreferences? = null

Cela ressemble à vous a ajouté @Inject annotation à la KotlinFragment classe

S'il vous plaît, changez-le en ceci et cela fonctionnera:

var mSharedPreferences: SharedPreferences? = null
        @Inject set

Voici le lien vers la documentation: https://kotlinlang.org/docs/reference/annotations.html


8
2018-01-23 20:12



Avez vous défini fun inject(fragment: KotlinFragment) dans ton ApplicationComponent? Parce que votre message d'erreur dit exactement cela.

EDIT: peut-être que vous n'avez pas fourni SharedPreferences dans votre module comme ceci:

@Module
public class AndroidModule {
    private final TimrApplication application;

    public AndroidModule(TimrApplication application) {
        this.application = application;
    }

    @Provides
    SharedPreferences provideSharedPreferences(){
        return PreferenceManager.getDefaultSharedPreferences(application);
    }
}

2
2017-11-09 18:54



Retirer le internal modificateur. Et je devais aussi déclarer lateinit et supprimez le facultatif.


2
2018-04-20 21:12