我正在以编程方式NavHostFragment为应用程序的每个功能插入一个。每个NavHostFragment都有自己的导航图。Dagger 通过使用FragmentFactory特定于每个功能来提供它们。它是具有 MVVM 架构的单一活动结构。
回购:https : //github.com/mitchtabian/DaggerMultiFeature/tree/nav-component-backstack-bug
签出分支“nav-component-backstack-bug”。
当导航到图表中时,片段不会被添加到 backstack 中。添加的唯一片段是最近访问过的片段。因此堆栈大小始终保持为 1。
最初我认为这是因为我没有将 设置FragmentFactory为 ,ChildFragmentManager但这并没有改变任何东西。有关相关代码,请参阅下面的代码片段。或者签出项目并运行它。我有日志打印出当前在 backstack 中的片段ChildFragmentManager和SupportFragmentManager. 两者的大小都是 1。
Feature1NavHostFragment.kt
这是习俗之一NavHostFragment。create()伴随对象中的函数是我创建它们的方式。
class Feature1NavHostFragment
@Inject
constructor(
private val feature1FragmentFactory: Feature1FragmentFactory
): NavHostFragment(){
override fun onAttach(context: Context) {
((activity?.application) as BaseApplication)
.getAppComponent()
.feature1Component()
.create()
.inject(this)
childFragmentManager.fragmentFactory = feature1FragmentFactory
super.onAttach(context)
}
companion object{
const val KEY_GRAPH_ID = "android-support-nav:fragment:graphId"
@JvmStatic …Run Code Online (Sandbox Code Playgroud) android android-fragments android-navigation android-architecture-navigation android-navigation-graph
描述
调用showSnackbar并SnackbarHostState传递duration参数不会关闭 Snackbar。协程似乎无限暂停。
重现步骤:
val snackbarHostState = remember{mutableStateOf(SnackbarHostState())}
Column {
Button(
onClick = {
lifecycleScope.launch {
val time = System.currentTimeMillis()
Log.d(TAG, "showing snackbar")
snackbarHostState.value.showSnackbar(
message = "Hey look a snackbar",
actionLabel = "Hide",
duration = SnackbarDuration.Short
)
Log.d(TAG, "done ${System.currentTimeMillis()-time}") // <-- Never called
}
}
) {
Text("Show snackbar")
}
snackbarHostState.value.currentSnackbarData?.let { snackbarData ->
ConstraintLayout(
modifier = Modifier.fillMaxSize()
) {
val snackbar = createRef()
Snackbar(
modifier = Modifier.constrainAs(snackbar) {
bottom.linkTo(parent.bottom)
start.linkTo(parent.start)
end.linkTo(parent.end)
}, …Run Code Online (Sandbox Code Playgroud)