我正在使用Dagger 2.11的<div id="tagsInput">
<input class="typeahead" type="text" placeholder="States of USA">
</div>
。
以下来源可以正常运行
@ContributesAndroidInjector
也在发挥作用。
@ActivityScope
但是当我读到document时,
我认为使用class MainActivity : AppCompatActivity(), HasFragmentInjector {
@Inject
lateinit var androidInjector: DispatchingAndroidInjector<Fragment>
override fun fragmentInjector() = androidInjector
@Inject
lateinit var fragment: MainFragment
@Inject
lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
fragmentManager.beginTransaction()
.replace(R.id.container, fragment)
.commitAllowingStateLoss()
viewModel.start("activity")
}
}
class MainFragment @Inject constructor() : Fragment() {
@Inject
lateinit var viewModel: MainViewModel
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater!!.inflate(R.layout.fragment_main, container, false)
return view
}
override fun onAttach(context: Context?) {
super.onAttach(context)
viewModel.start("fragment")
}
}
@Module
abstract class AndroidModule {
@ActivityScope
@ContributesAndroidInjector
abstract fun contributeMainActivity(): MainActivity
}
@ActivityScope
class MainViewModel @Inject constructor() {
...
以及活动是正确的。
在答案here中,它也写成
@ConstructsAndroidInjector
我的实施有问题吗? 我的实施会出现什么问题?
答案 0 :(得分:0)
片段由Android中的FragmentManager
管理。
在FragmentActivity
的子类中,包括AppCompatActivity
,在您的Activity上调用onSaveInstanceState(Bundle outBundle)
时,它将保存您的片段的状态。
同样onCreate(Bundle savedInstanceState)
会尝试恢复它们。您可以通过启用Developer Options / Don't keep Activities
并导航进出应用来实现此目的。
在这种情况下,如果您使用Dagger 2再次请求注入片段字段,则活动将引用片段的两个副本 - 已恢复的片段和新注入的片段。你不想要这个!相反,在onCreate
中处理片段的正确习惯如下:
fragment = fragmentManager.findFragmentByTag("MAIN")
if (fragment == null) fragment = MainFragment.instantiate(null)
fragmentManager.beginTransaction()
.replace(R.id.container, fragment, "MAIN")
.commit()
其中MainFragment.instantiate(Bundle args)
是companion object
中的静态方法。