在@ Dagger2上使用@Inject for Android的Fragment是一个好习惯吗?

时间:2017-11-01 04:43:56

标签: android android-fragments kotlin dagger-2 dagger

我正在使用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

我的实施有问题吗? 我的实施会出现什么问题?

1 个答案:

答案 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中的静态方法。