小编Lov*_*ove的帖子

Android Studio和Kotlin:未解决的参考:也

可以从Android Studio编译和运行:

val greeted = "World".also { println("Hello $it") }
Run Code Online (Sandbox Code Playgroud)

然而,编辑突出显示alsoit作为错误,并没有给intellisense提供任何帮助.申请仍然有效,当我去源I可以看到两者的定义applyalso.如何让Android Studio识别also

  • Android Studio 2.3.3
  • kotlin_version ='1.1.3-2'
  • Kotlin插件1.1.3-release-Studio2.3-2

我在早期版本中也遇到过这个问题.

android kotlin android-studio kotlin-extension

10
推荐指数
2
解决办法
6387
查看次数

Android:在 ViewModel 中获取 DAO

在 ViewModel 中获得 Android Room DAO 的最佳方法是什么?

基于分页库示例,我编写了这个 ViewModel:

class MyViewModel(myDao: MyDao) : ViewModel() {

    val data = myDao.get().create(
            /* initial load position */ 0,
            PagedList.Config.Builder()
                    .setPageSize(50)
                    .setPrefetchDistance(50)
                    .build())
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试获取一个实例

val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)

尝试运行此程序时出现异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{....MyActivity}: java.lang.RuntimeException: Cannot create an instance of class ...MyViewModel
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
    at android.app.ActivityThread.-wrap11(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
 Caused by: java.lang.RuntimeException: Cannot create an …
Run Code Online (Sandbox Code Playgroud)

android kotlin android-architecture-components

7
推荐指数
1
解决办法
1997
查看次数

Kotlin短路图{} .firstOrNull {}

我需要映射一个列表并检索第一个非null元素,我需要将map操作短路,就像它应该在Java 8流API中一样.有没有Java 8流可以在Kotlin中做到这一点?

我创建了自己的扩展方法来执行此操作:

fun <T, R> Iterable<T>.firstNonNullMapping(transform: (T) -> R?): R? {
    for (element in this) {
        val result = transform(element)
        if (result != null) {
            return result
        }
    }
    return null
}
Run Code Online (Sandbox Code Playgroud)

测试证明这是有效的

val firstNonNullMapping = listOf(null, 'a', 'b')
        .firstNonNullMapping {
            assertNotEquals(it, 'b') // Mapping should be stopped before reaching 'b'
            it
        }
assertEquals(firstNonNullMapping, 'a')
Run Code Online (Sandbox Code Playgroud)

但是,IntelliJ建议我用更整洁的东西替换我的for循环

return this
        .map { transform(it) }
        .firstOrNull { it != null }
Run Code Online (Sandbox Code Playgroud)

问题是这将映射iterable的所有元素,并且对于我的第一个非null元素停止的用例是必不可少的.

kotlin

5
推荐指数
2
解决办法
2460
查看次数