kotlin - 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)
}
})
它有效,但我认为你可以用不同的方式做
解决方案
您的 lambda 从外部而不是从 lambda 参数获取其上下文,因此它的签名与您的接口的签名不匹配。
尝试这个:
ActivityScreen { LaunchActivity.newIntent(it) }
如果它不能从中推断出上下文,我猜你需要:
ActivityScreen { context: Context -> LaunchActivity.newIntent(context) }
推荐阅读
- android - 如何将 ToyVpn 导入到 android studio 并构建
- javascript - 如何使用 JavaScript 中的特定关键字验证格式良好的 XML(大于/小于)标签?
- ios - FCM 静默通知仅有效一次 (Swift)
- node.js - 如何根据输入字段/文本从 mongoDB 查询/获取数据
- php - 调用自己调用方法的父方法?
- python - 遍历嵌套列表并检索属性(python)
- python - 如何以简化的方式重命名多个列
- java - 如何在带有动画的 JavaFX 应用程序中为字符创建老虎机?
- java - readUTF() 在 writeObject() 之后返回错误
- c# - 如何在 windows 窗体 c# 中对此类代码进行单元测试