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
}
}
メッセージグラドルビルド
偶然に、私は自分の答えに出くわして、実際には(少なくとも私のユースケースでは)機能していないことを告白しなければなりません。 Avilioの答え を考慮してください。これは私にとってもうまくいきました:internal
をlateinit
に置き換えてください。
internal
修飾子を削除します。 Daggerは、注釈付きフィールドにアクセスするために、少なくともパッケージプライベートアクセスが必要です。 Kotlinでは、internal
修飾子はnotJavaのパッケージプライベートアクセス修飾子の代替です。
JavaとKotlinの修飾子の違いの詳細な説明については、断片化されたポッドキャストの episode#101 - "Learning Kotlin – visibility modifiers、internal修飾子、モジュール」、および 公式ドキュメント 。
ここに間違いがあります:
@Inject
internal var mSharedPreferences: SharedPreferences? = null
@Inject
アノテーションをKotlinFragment
クラスに追加したようです
これに変更すると動作します:
var mSharedPreferences: SharedPreferences? = null
@Inject set
ドキュメントへのリンクは次のとおりです。 https://kotlinlang.org/docs/reference/annotations.html
Internalキーワードを削除しても、同じエラーが発生しました。そこで、私は内部をlateinitに置き換えました。
これを簡単に行うには、この行を変更します
@Inject
internal var mSharedPreferences: SharedPreferences? = null
に
@set:Inject
internal var mSharedPreferences: SharedPreferences? = null
私の場合、この作品は魅力のようです。
@Inject
lateinit var mSharedPreferences: SharedPreferences
また、これは私にとっても初期化変数を遅らせるために働いた
ApplicationComponent
でfun 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);
}
}
internal
修飾子を削除します。また、lateinit
を宣言し、Optionalを削除する必要がありました。