web-dev-qa-db-ja.com

Kotlinエラー:ダガーはプライベートフィールドへの注入をサポートしていません

KotlinアクティビティViewPagerで使用し、Kotlin Fragmentでは短剣注入を使用します。エラー:ダガーはプライベートフィールドへの注入をサポートしていません。 In Java短剣注入作業を断片化します。なぜkotlin faragmentに短剣を注入できないのですか?

私のコトリン活動で

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]
        }
    }

私のコトリンの破片

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
}

}

メッセージグラドルビルド

enter image description here

30
eurosecom

偶然に、私は自分の答えに出くわして、実際には(少なくとも私のユースケースでは)機能していないことを告白しなければなりません。 Avilioの答え を考慮してください。これは私にとってもうまくいきました:internallateinitに置き換えてください。


古い答え

internal修飾子を削除します。 Daggerは、注釈付きフィールドにアクセスするために、少なくともパッケージプライベートアクセスが必要です。 Kotlinでは、internal修飾子はnotJavaのパッケージプライベートアクセス修飾子の代替です。

JavaとKotlinの修飾子の違いの詳細な説明については、断片化されたポッドキャストの episode#101 - "Learning Kotlin – visibility modifiers、internal修飾子、モジュール」、および 公式ドキュメント

42
azizbekian

ここに間違いがあります:

    @Inject
internal var mSharedPreferences: SharedPreferences? = null

@InjectアノテーションをKotlinFragmentクラスに追加したようです

これに変更すると動作します:

var mSharedPreferences: SharedPreferences? = null
        @Inject set

ドキュメントへのリンクは次のとおりです。 https://kotlinlang.org/docs/reference/annotations.html

36
Danylo Volokh

Internalキーワードを削除しても、同じエラーが発生しました。そこで、私は内部lateinitに置き換えました。

26
Avilio

これを簡単に行うには、この行を変更します

@Inject
internal var mSharedPreferences: SharedPreferences? = null

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

私の場合、この作品は魅力のようです。

13
Hemant Parmar
@Inject
lateinit var mSharedPreferences: SharedPreferences

また、これは私にとっても初期化変数を遅らせるために働いた

4
0xAliHn

ApplicationComponentfun inject(fragment: KotlinFragment)を定義しましたか?あなたのエラーメッセージがまさにそれを言っているように見えるからです。

編集:多分あなたはあなたのモジュールでSharedPreferencesをこのように提供していない:

@Module
public class AndroidModule {
    private final TimrApplication application;

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

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

internal修飾子を削除します。また、lateinitを宣言し、Optionalを削除する必要がありました。

2