小编Dmy*_*iev的帖子

<androidx.fragment.app.FragmentContainerView> 与 <fragment> 作为 NavHost 的视图

androidx.fragment.app.FragmentContainerView用作 navHost 而不是常规fragment应用程序时,在方向更改后无法导航到目的地。

我收到以下错误: java.lang.IllegalStateException: no current navigation node

是否有我应该知道的正确使用它的问题,或者我使用导航组件的方式不正确?

带有视图的简单活动 xml:


...
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        app:navGraph="@navigation/nav_simple" />
...
Run Code Online (Sandbox Code Playgroud)

导航代码:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_legislator.xml"
    app:startDestination="@id/initialFragment">

    <fragment
        android:id="@+id/initialFragment"
        android:name="com.example.fragmenttag.InitialFragment"
        android:label="Initial Fragment"
        tools:layout="@layout/initial_fragment">
        <action
            android:id="@+id/action_initialFragment_to_destinationFragment"
            app:destination="@id/destinationFragment" />
    </fragment>
    <fragment
        android:id="@+id/destinationFragment"
        android:name="com.example.fragmenttag.DestinationFragment"
        android:label="Destination Fragment"
        tools:layout="@layout/destination_fragment" />

</navigation>
Run Code Online (Sandbox Code Playgroud)

这是一个 github 存储库,您可以在其中轻松重现错误:https : //github.com/dmytroKarataiev/navHostBug

navigation android android-architecture-components

29
推荐指数
2
解决办法
2万
查看次数

Dagger Hilt 具有接口的多个实现

使用 Dagger2 可以轻松显式创建组件并列出它们的依赖项。但我似乎找不到一种方法来提供接口的不同实现,比如片段。

例如,我的应用程序有 2 种生产模式:付费和免费。我有一个 PaidActivity 和一个 FreeActivity,它们都使用 Analytics 类启动完全相同的仪表板片段。对于付费,我提供 PaidAnalytics 实现,对于免费,我提供 FreeAnalytics 实现。

使用 Dagger2,只需在活动的组件(或子组件)中列出付费或免费模块即可轻松实现。

@Module
abstract class FreeActivityModule {

    @ContributesAndroidInjector(
        modules = [
            FreeAnalyticsModule::class,
            DashboardFragmentModule::class
        ]
    )
    abstract fun injectFreeActivity(): FreeActivity

}

@Module
abstract class PaidActivityModule {

    @ContributesAndroidInjector(
        modules = [
            PaidAnalyticsModule::class,
            DashboardFragmentModule::class
        ]
    )
    abstract fun injectPaidActivity(): PaidActivity

}

@Module
abstract class DashboardFragmentModule {

    @ContributesAndroidInjector
    abstract fun injectDashboardFragment(): DashboardFragment

}

class DashboardFragment : Fragment() {

    ...

    @Inject
    lateinit var analytics: Analytics

    ...

}

Run Code Online (Sandbox Code Playgroud)

对于 Dagger Hilt,我找不到办法做到这一点。

android dependency-injection dagger-2 dagger-hilt

11
推荐指数
1
解决办法
5279
查看次数