首页 > 解决方案 > Kotlin - SAM 接口出错(Android 路由 Cicerone)

问题描述

我开始在 android 应用程序中使用该库来获取路由。出现这样的问题,不知道怎么解决。

Type mismatch.
Required:
    Creator<Context, Intent>
Found:
    () → Intent

图书馆使用 Cicerone。我创建了我的对象类 Screens 并根据一些来源制作了这样的实现

import com.csproject.rflex.app.App
import com.csproject.rflex.presentation.launch.LaunchActivity
import com.github.terrakok.cicerone.androidx.ActivityScreen

object Screens {

    fun launch() = ActivityScreen {
         LaunchActivity.newIntent(App.instance.getAppContext())
    }

}

活动代码片段

class LaunchActivity: ABaseActivity(), ILaunchView {

    companion object{
        fun newIntent(context: Context) = Intent(context, LaunchActivity::class.java)
    }

图书馆类

sealed class AppScreen : Screen

fun interface Creator<A, R> {
    fun create(argument: A): R
}

open class FragmentScreen @JvmOverloads constructor(
    private val key: String? = null,
    private val fragmentCreator: Creator<FragmentFactory, Fragment>
) : AppScreen() {
    override val screenKey: String get() = key ?: super.screenKey
    fun createFragment(factory: FragmentFactory) = fragmentCreator.create(factory)
}

open class ActivityScreen @JvmOverloads constructor(
    private val key: String? = null,
    private val intentCreator: Creator<Context, Intent>
) : AppScreen() {
    override val screenKey: String get() = key ?: super.screenKey
    open val startActivityOptions: Bundle? = null
    fun createIntent(context: Context) = intentCreator.create(context)
}

UPDATE #1 我稍微修改了代码,但我不确定它是否应该以这种方式工作

fun launch(context: Context) = ActivityScreen (intentCreator = object: Creator<Context, Intent> {
        override fun create(argument: Context): Intent {
            return MainActivity.newIntent(context)
        }
    })

它有效,但我认为你可以用不同的方式做

标签: kotlin

解决方案


您的 lambda 从外部而不是从 lambda 参数获取其上下文,因此它的签名与您的接口的签名不匹配。

尝试这个:

ActivityScreen { LaunchActivity.newIntent(it) }

如果它不能从中推断出上下文,我猜你需要:

ActivityScreen { context: Context -> LaunchActivity.newIntent(context) }

推荐阅读