Android Studio вставляет зависимости в динамически создаваемый фрагмент с помощью Dagger 2 - PullRequest
0 голосов
/ 28 мая 2018

Я создал очень минимальный проект Android Studio, используя библиотеку, расположенную по адресу https://github.com/arranlomas/DaggerViewModelHelper, чтобы внедрить мою ViewModel в мой фрагмент.Я хочу динамически добавить фрагмент в свою активность и вставить в него зависимости фрагмента (ViewModel, о котором я упоминал ранее), без необходимости явно создавать эти зависимости в Activity.Вот некоторый код для пояснения:

class MainActivity : AppCompatActivity(), Injectable {

private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
    when (item.itemId) {
        R.id.navigation_home -> {
            message.setText(R.string.title_home)
            val weeklyFragment = WeeklyFragment.newInstance()
            openFragment(weeklyFragment)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_dashboard -> {
            message.setText(R.string.title_dashboard)
            return@OnNavigationItemSelectedListener true
        }
        R.id.navigation_notifications -> {
            message.setText(R.string.title_notifications)
            return@OnNavigationItemSelectedListener true
        }
    }
    false
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    ButterKnife.bind(this)

    val viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
    navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
}

private fun openFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.content_container, fragment)
    transaction.addToBackStack(null)
    transaction.commit()
}

И мой код WeeklyFragment:

class WeeklyFragment : Fragment(), Injectable {
// View elements
@BindView(R.id.weekly_text) lateinit var myTextView: TextView

// View Model Factory
@Inject
lateinit var viewModelFactory: ViewModelProvider.Factory

companion object {
    fun newInstance(): WeeklyFragment = WeeklyFragment()
}

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
        inflater.inflate(R.layout.fragment_weekly, container, false)

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)

    val viewModel = ViewModelProviders.of(this, viewModelFactory).get(MyViewModel::class.java)
    viewModel.makeFooString().observe(this, Observer<String> { myTextView.text = it })
}

}

Прямо сейчас я могу внедрить MyViewModel в свой MainActivity и использовать его(если я немного переставлю код), но я хочу внедрить MyViewModel в WeeklyFragment без необходимости объявлять его в MainActivity.Я подозреваю, что должен изменить способ создания экземпляра и «транзакции.replace» WeeklyFragment, но я не нашел информации о том, как конкретно этого добиться.Когда я запускаю приведенный ниже код, я получаю:

java.lang.IllegalArgumentException: No injector was found for com.dev.myproject.view.weekly.WeeklyFragment
                  at dagger.android.support.AndroidSupportInjection.findHasFragmentInjector(AndroidSupportInjection.java:92)
                  at dagger.android.support.AndroidSupportInjection.inject(AndroidSupportInjection.java:57)
                  at com.arranlomas.daggerviewmodelhelper.AppInjector$handleActivity$1.onFragmentCreated(AppInjector.kt:61)
                  at android.support.v4.app.FragmentManagerImpl.dispatchOnFragmentCreated(FragmentManager.java:3467)
                  at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1387)
                  at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1188)
                  at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1071)
                  at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:115)
                  at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2380)
                  at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
                  at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
                  at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:703)
                  at android.os.Handler.handleCallback(Handler.java:751)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:154)
                  at android.app.ActivityThread.main(ActivityThread.java:6077)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

Как я могу успешно внедрить зависимости в WeeklyFragment?

1 Ответ

0 голосов
/ 12 июня 2018

Похоже, вы забыли добавить метод @ContributesAndroidInjector в свой @Module.Dagger не может внедрить что-либо (ViewModel или нет) в ваш фрагмент без этого

...