在lambda中使用接收者的中缀函数(对于DSL)

我正在使用Kotlin创建一个DSL,并且我希望利用带有中缀函数的接收器对象来获得这种常规的DSL感觉。 我将从下面的语法例子开始: myDslFunction {myReceiversInfixFunc“一些字符串”} 我的计划是这样的代码: fun myDslFunction(builderFunction: MyReceiverObject.() -> Unit) { val receiver = MyReceiverObject() builderFunction(receiver) // do something with receiver } class MyReceiverObject { infix fun myReceiversInfixFunc(someString: String) { // do something with someString } } 上面的函数和类片段编译得很好,但是上面列出的DSL语法没有。 以下是我编写的用于测试编译的一些测试函数: fun test() { // desired syntax myDslFunction { myReceiversInfixFunc “some string” // doesn’t compile } // […]

Base64支持不同的API级别

在我的Android应用程序 的build.gradle android { compileSdkVersion 27 defaultConfig { minSdkVersion 16 targetSdkVersion 27 … } …. } Kotlin代码 val data = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { Base64.getDecoder().decode(str) } else { Base64.decode(str, Base64.DEFAULT) // Unresolved reference: decode } 显然,在API 24之前使用Base64变体时,出现了编译错误。 但是我怎样才能像以前一样支持所有的API级别并使用Base64?

在kotlinunit testing中获得lambda捕获器的调用计数

我有这个小小的和平代码,我想在我的主持人(MVP) fun load(id: String) { storage.load(id, { result -> this.result = result view?.notifyLoaded(result) }, { string -> … }) } 。 我在我的unit testing用例中storage.load(String, (Result)->Unit, (String)->Unit) 。 `when`(storage.load(eq(testResult.id), any Unit>(), any Unit>())).thenAnswer({ invocation -> (invocation.getArgument(1) as? (Result) -> Unit)?.invoke(testResult) }) 现在我的测试案例看起来像这样 @Test fun testLoading() { /* Given */ … /* When */ presenterUnderTest.load(testResult.id) /* Then */ […]

Kotlin获得没有实例的genericstypes

嗨,想要得到types的T ,但我不能从实例得到它,我必须从类参数得到它,如何做到这一点? abstract class ViewModelFragment{ protected lateinit var mViewModel: T override fun onViewCreated(view: View, savedInstanceState: Bundle?) { mViewModel = ViewModelProviders .of(scope) .get(getGenericTClass()) // .get(mViewModel.javaClass) // not working either } inline fun getGenericTClass() = R::class.java } 现在编译器抱怨 不能使用’T’作为精炼类的types。 改用Class。 我试过使用的解决方案: https : //stackoverflow.com/a/34463352/2163045但不为我工作

MapOnClickListener似乎不工作

我正在使用Kotlin和GoogleMap编写应用程序。 我有地图,我试图设置一个只记录消息的OnMapClick监听器。 构建是好的,但是当我点击地图时,没有任何反应。 我已经查找了文档,但是我没有发现任何关于这样的问题。 这里的地图代码: class map : FragmentActivity(), OnMapReadyCallback { private var mMap: GoogleMap? = null override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap mMap?.setOnMapClickListener { GoogleMap.OnMapClickListener { p0 -> Log.d(“Map”, p0.toString()) } } } } 我在Java中发现了很多关于GoogleMap的文档,但是Kotlin没有,所以我自己试了一下。 感谢您帮助我find这个代码有什么问题。

一旦分配了一个非null值,将a从var更改为val的属性?

如果Kotlin会添加一个属性,一旦赋值为非空值,那么var属性将被更改为val,这意味着您不能再更改该值了吗? val? context Context? = null … … … context = this … … … context = this.applicationContext //would be an error since context //is val 以上只是一个例子,它是多么有用…

kotlin-kapt插件不使用“kapt.generateStubs”

我最近从Android Studio 2.3更新到3.0,kotlin 1.1.4到1.1.51 。 现在我在我的gradle控制台中看到这条消息: kotlin-kapt插件不使用“kapt.generateStubs” 我有这在我的build.gradle让我的项目使用注释处理一些库工作: kapt {generateStubs = true} generateStubs行不再需要,可以安全地删除? 还是有另一个行动,我应该采取消除上述警告消息?

默认参数vs重载,何时使用哪个

在Kotlin中,有两种方法可以通过指定默认参数值来表示可选参数: fun foo(parameter: Any, option: Boolean = false) { … } 或通过引入过载: fun foo(parameter: Any) = foo(parameter, false) fun foo(parameter: Any, option: Boolean) { … } 在哪种情况下首选哪种方式? 这种function的消费者有什么区别?

我如何使用Kotlin Anko使用Android Bootstrap Library?

Android Bootstrap库 例如,在这里标准的Anko按钮; button{ text = “OK” setOnClickListener{ toast(“ok”) } } 我如何使用自定义样式?

“这个”在这方面没有定义

我如何解决以下情况? interface I class A(i: I) class C : I, A(this) // << — 'this' is not defined in this context 总之,我想将类实例传递给超类的构造函数。 Kotlin有可能吗? PS所有的答案都是好的,技术上是正确的。 但是让我们举一个具体的例子: interface Pilot { fun informAboutObstacle() } abstract class Car(private val pilot: Pilot) { fun drive() { while (true) { // …. if (haveObstacleDetected()) { pilot.informAboutObstacle() } // …. } } […]