Kotlin Multiplatform 的文档添加了不少,这次来不及翻译了,等下次吧
]]>前一次没有翻译的这一章 “教程 - 协程(Coroutine)与通道(Channel)” 也补上了 https://kotlin.liying-cn.net/coroutines-and-channels.html
欢迎大家多多转发,帮忙宣传一下,谢谢
]]>https://kotlin.liying-cn.net/whatsnew21.html
欢迎大家多多转发,帮忙宣传一下,谢谢
]]>https://kotlin.liying-cn.net/whatsnew2020.html
欢迎大家多多转发,帮忙宣传一下,谢谢
还有几个不重要的页面没有翻译,留到下一次吧
官方文档又更新到了 2.1.0 ,下面来翻译这个版本,争取 1 月以内完成吧
]]>MainActivity.kt
, ActivityTransitionReceiver.kt
具体内容见我的 Notion 页面
因为发现只要有其它内容就显示,Sorry,you have been blocked you are unable to access v2ex.com
运行 Logcat 里出现的上面定义的内容只有: 2024-11-26 22:27:33.925 22028-22028 ActivityRecognition com.example.testphysicalrecord D Transition updates started successfully
广播里的 Log 一个都没有,接下来要怎么找到问题在哪里呢?
已经问过 ChatGPT4o, 4omini, 尝试过多种问法,尝试过让它们从零写一个(上面的就是),但是没有一个解决问题没有一个能成功检测到活动
尝试过 Activity Recognition Transition API Codelab 这里的 java 版的例子,complete 的版本,也没有检测到活动
应用里能给的权限都给了
尝试过 ActivityRecognitionClient API ,也检测不到活动
试着在 github 找了一些安卓活动监测的 repo ,最近一年内更新过的,下载安装后也都没有检测到活动
接下来要怎么定位问题呢?
]]>一共 330 个左右的页面, 变更较少的页面已经更新完成了 还剩下变更比较多的 60 个左右页面,大约 300 页内容 争取 12 月或 1 月以内能够完成
]]>现在生成的页面风格和官方文档基本一样了,清爽了很多
]]>如果是在 java 里面直接在方法里面抛出 2 个异常即可。 但是在 kotlin 里面必须
val runResult = runCatching{ HttpResponse(it.isSuccessful,it.code,it.message) } if(runResult.isFailure){ when(moveFileAgain.exceptionOrNull()){ // 单独处理异常 } } // 还有写一些(这里请求成功了) if(result.code == 404){ return runResult.getOrDefault() } if(result.code == 401){ // 认证失败了 return runResult.getOrDefault() }
如果是在 java 里面就再简单不过了,直接定义两个异常,全局处理. 受检查异常是真的爽。 特别是在嵌套请求,1 个 api 要请求好几次的情况。
这么说吧。 这里面的很多常见使用 java 来写代码可能要简单的多。 哪有这么多的破事。
大佬们有什么办法处理这种事情, 我的要求就是登陆 401 或者有异常直接返回就是了。kotlin 实在是太繁琐了。
]]>var s: String 代表不为空
var s: String? 代表可为空
奇葩操作来了,在我接手之前,除了绝大部分的基本变量,其余所有变量都是 String?、Objxx?
使用的时候:
if (S != null) print(s) else throw Exption("s shouldn't be null")
或者:
if (obj?.s == null) return obj!!.s
一开始很好奇这个脑残写法是怎么来的
然后遇到了一个 crash 我找到根源了。我写的代码里没有用 String? ,但是却报了 NPE ,赋值的地方都查过了,不存在 null 。最终不断地调试发现每次页面 onDestory()的时候会有个反射递归地将所有变量和变量里的变量都设置成 null (说是在手动 GC…)。又因为魔改了生命周期+协程,读取变量的时候已经是 null 了,然后报错==
!
]]>https://kotlinlang.org/docs/whatsnew20.html
GPT-4o 的总结:
K2 编译器:
IDE 支持:
Gradle 集成:
Lambda 函数:
Kotlinx-metadata-jvm 库:
Kotlin/Native 增强:
Kotlin/Wasm:
@JsExport
函数。智能类型转换:
if
、when
和 while
块中的智能类型转换,减少手动类型断言。Kotlin 2.0.0 语言层面没有新特性,但是引入 K2 编译器,提高了性能。
想问一下大家上海/杭州有用 Kotlin 做服务端的公司吗?
]]>@Target(AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER) @Retention(AnnotationRetention.SOURCE) @Suppress("unused", "CanBePrivate") annotation class Api
现在最新的 1.9.20 正在翻译,争取 1 到 2 个月内完成
地址 https://kotlin.liying-cn.net/docs/reference_zh/about_translation.html
代码库 https://github.com/LiYing2010/kotlin-web-site
欢迎访问
]]>难道说 Kotlin 的协程目前的唯一作用就是让安卓同学不会把 UI 卡死吗?
]]>依据 Spring 官方文档 的说明是,Spring 目前仅支持 R2DBC 事务与 Kotlin 协程的组合,JDBC 事务需要用到 ThreadLocal ,在协程中启动事务会出问题,相关讨论和问题可以参考以下链接:
我目前对响应式框架的了解还不足,所以我想请教一下,是不是为了充分发挥 Kotlin 协程的优势,就必须将项目整体迁移到 WebFlux + R2DBC 下?
另外,我也想了解一下,即将到来的 JDK 21 的虚拟线程和 Kotlin 协程会有怎样的关系?
感谢各位的帮助与意见。
]]>比如在 Compose Multiplatform 中提供的的例子都是引用三方的,如 MVIKotlin( 见 https://github.com/JetBrains/compose-multiplatform/blob/master/examples/todoapp/common/main/build.gradle.kts)
所以 VM 层现在最推荐的解决方案是什么样的?
]]>这边的游戏需要设计一个可以将效果原子化和序列化的功能,由于 function 方法不可被原子化,且我这边无法使用 lua ,因此我设计了一个能输入和输出任意类型的抽象语法树,可以对其节点进行序列化和反序列化,从而使得整个树可以序列化。当前设计如下: 有一个接口(astNode),简称基类,有一个泛型 O ,有一个 operation 方法,输出类型是 O ,传参是 map<string ,object> 在基类第二层的是结构化节点:叶子节点和枝干节点,都继承自第一层。 叶子节点只存储一个值,但不能存节点,有两个泛型,一个是记录存储属性类型的,一个是记录返回类型的。叶子节点就两种,一种记录常数(constant),比如 2x+1 里的 2 和 1. 另一种记录未知数(param),就是 2x+1 里的 x ,他会读取 operation 方法传过来的 map ,从里面找到对应的对象。 枝干节点则里面可以存储叶子节点或枝干节点。 他们有三种类型,单节点型,list 型和 pair 型,单节点的,比如提取目标怪兽的血量,里面就只需要记录一个指向怪兽的叶子节点。双节点最常见,加减乘除,operation 方法就是将两个节点 operation 的值进行运算。list 节点则是类似 in ,传入一个 list ,他从里面返回一个符合需求的值。 然后第三层就是对运算目标的类型进行定义的层。比如 equals ,有针对数字的 equals ,有针对怪物实体的 equals ,等等,这一层将他们进行封装。 第四层是封装层,这层会将所有泛型全部匹配,不会出现需要在外面输入泛型的情况。 在最外侧,会有一个 tree 实体,这个实体可以访问根节点,并进行如深度搜索或者是查找节点,替换节点之类的行为。 现在的问题是: 我想要一个方式能将这个树序列化和反序列化,并通过读取用户输入将其转换为一个树。 我最开始是打算从根节点向叶子节点进行构建,但我很快发现这个方法的不可操作性:因为我的树不是完全的二叉树,有常数和未知数两种没有子节点概念的树,他们只有一个 value ,而且由于我有三种不同类型的枝干节点,我无法使用一个统一的,写在基类里的 addNode 方法在节点生成后对子节点进行操作,我必须使用 if else 才行,这违背了泛型的初衷,也十分不灵活,所以我必须从最下方的叶子节点往上方构建。 我的打算是,先筛选出所有的叶子节点,然后像搭金字塔一样,用 1 ,2 ,list 个节点将符号构建出来,然后在这个符号上再和其他符号或者节点一起搭符号,最后搭到根节点。但是这有个问题:当我在使用如 numberEqualsNode ,这种左右节点一个是 int ,另一个也是 int ,输出是 bool 的节点,我该如何判断输入的 node 的泛型是 int ?如果不判断,那么左右节点设置泛型的意义何在? 由于 java 的泛型是在运行之后会被删掉的和注释一样的用于检查编译的东西,所以我不能直接 if node is node<int>,但那样我怎么检查这个节点?
备注:无法换语言,或者使用 lua ,但可以使用 kotlin 和 scala 。可以改变一些设计,但不能把整个底层都给刨了。
]]> fun setValue(variables: Map<String, Any>, value: Any?) { val instance = operand.eval(variables) ?: throw NullPointerException("instance is null") if (instance is LogicList<*>) { instance.set(property.key.replace("[", "").replace("]", "").trim().toInt(), value) } else { throw IllegalArgumentException("变量 ${(operand as Variable).key} 不是数组") } }
代码如上 instance.set 方法 idea 提示我第二个参数 element 是 NoThing 类型 导致我 set 方法无法调用
Kotlin: Type mismatch: inferred type is Any? but Nothing was expected
直接编译 报了如上错误 instance 本身是 Any?类型的,由于做了 null 校验,所以是 Any 类型的。 LogicList 是 ArrayList 的扩展类,set 方法又 List 提供的。 这边我不太清楚要怎么改了,我本身也不太懂 kotlin 。
]]>视频上说不能: [ [码上开学] 到底什么是「非阻塞式」挂起?协程真的比线程更轻量级吗?-哔哩哔哩] https://b23.tv/qIkWUmo
]]>import android.os.Bundle import com.google.android.material.snackbar.Snackbar import androidx.appcompat.app.AppCompatActivity import androidx.navigation.findNavController import androidx.navigation.ui.AppBarConfiguration import androidx.navigation.ui.navigateUp import androidx.navigation.ui.setupActionBarWithNavController import android.view.Menu import android.view.MenuItem import com.example.myapplication2.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var appBarConfiguration: AppBarConfiguration //创建 2 个变量 private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) setSupportActionBar(binding.toolbar) val navCOntroller= findNavController(R.id.nav_host_fragment_content_main) appBarCOnfiguration= AppBarConfiguration(navController.graph) setupActionBarWithNavController(navController, appBarConfiguration) binding.fab.setOnClickListener { view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show() } } override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.menu_main, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { return when (item.itemId) { R.id.action_settings -> true else -> super.onOptionsItemSelected(item) } } override fun onSupportNavigateUp(): Boolean { val navCOntroller= findNavController(R.id.nav_host_fragment_content_main) return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp() }
}
我是个萌新,刚学 Kotlin,有没有推荐群一起学习?
按照以上代码,如果我有个按钮 id="create_button" ,按下载入 test_window.xml 窗口. test_window.xml 里面有什么讲究吗?
]]>详见翻译报告:重新设计的 Kotlin Logo
]]>class A class B val a: A? = null val b: B? = null fun foo(a: A, b: B) { println(a) println(b) } suspend fun main() { a?.let { b?.let { foo(a, b) } } }
除了a?.let { b?.let { foo(a, b) } }
这种形式和 if a!= null && b!= null
,还有啥其他好办法吗?
现在找到一个 arrow 库可以用 option dsl 实现比较漂亮的包装
option { foo(a.bind(), b.bind()) }
]]> class Min { override fun eval(variables: Map<String, Any>): Any = { val values = parameters.map { it.eval(variables) } min(values[0] as Double, values[1] as Double) } }
这个函数啊在 IDEA 的 evaluate 中执行 返回了 Min$eval$1 类的实例 ()-> Kotlin.Double
override fun eval(variables: Map<String, Any>): Any { val values = parameters.map { it.eval(variables) } return min(values[0] as Double, values[1] as Double) }
我把它改成了普通的 return 函数就没这个问题了 可以返回具体的值
求解这种直接等于号赋值的操作 和普通函数使用 return 的操作 有什么区别
]]>val kotlin = "ABCDEF".asSequence() .groupingBy { println("grouping") it.toInt() / 10 } .aggregate { _, accumulator: MutableList<String>?, element, first -> println("aggregate") if (first) { val tmp = MutableList(0) { "" } tmp.add(element.toString() + "X") tmp } else { accumulator!!.add(element.toString() + "X") accumulator } } println(kotlin) val java = "ABCDEF".toList().stream() .collect( Collectors.groupingBy( { println("java grouping"); it.toInt() / 10 }, Collectors.mapping({ println("java mapping"); it.toString() + "X" }, Collectors.toList()) ) ) println(java)
]]> suspend fun getDepart(){ fun getSubDepart(pid):List<Department>{ val subList:List<departId> = dingApi.getSubDepartList(pid) return subList.map{ Department(it,getSubDepart(it)) } } return Department(1,getSubDepart(1)) } data class Department(val departId,val subList:List<Department>) //sublist 是下属部门列表
业务大概如此描述,同步状态下很简单,请问协程要怎么实现呢?
我用 withcontext ()包裹追钉钉 api,结果 build 时无法通过,报 call to 'resume' before 'invoke' with coroutine
请问有大佬能帮助一下吗?
]]>楼主是一枚菜鸡大学生,安卓开发的老师决定从这学期开始用 kotlin 教安卓开发 楼主安卓开发和 kotlin 都没接触过,所以想自己找一份教程课外学习,求有了解的大佬介绍一份比较新的
因为被一本老书折腾了好久
搜到了很多人安利的 Kotlin for android developers 的中文版 然后发现版本太老了,里面用的 anko 库现在已经废弃了但是也还能用 RecyclerView 库已经从 7 变成了安卓 x
val forecastList=findViewById(R.id.forecast_list) as RecyclerView
改用 x 之后,findviewbyid 又报错
Inspection info: This inspection reports findviewByld calls with type casts which can be converted to findViewByld with a type parameter from Android 8.0(API level 26)
Fastjson 情况类似
网上搜了一下 jackson 需要引入 kotlin module 和大量注解配合才能使用 data class
请问有啥方便的轮子可以用么?
]]>Example example = new Example(); // 这里解析一些文本并给 example 的成员变量赋值 // do something... // 检测是否所有变量都被初始化 Field[] fields = Example.class.getFields() for (Field field : fields) { try { Object o = field.get(example); if (o == null) { throw new Exception(); } } catch (IllegalAccessException ignored) { } }
kotlin 代码中,所有成员变量都用了 lateinit 修饰符, 那有没有类似的方法可以,检测所有变量是否被 initialized
]]>fun main() { val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3, "threeAgain" to 3) numbersMap.keys.remove("one") println(numbersMap) numbersMap.values -= 3 println(numbersMap) numbersMap.values.remove(3) println(numbersMap) }
对于numbersMap.values -= 3
这个-=
的运算符重载的源码在哪里呢,难道是 native 么 ide 里面点了半天都是 MutableCollection 的 minusAssign 方法,但是并不清楚这个内部的 values:MutableCollection 的-=的重写如何关联到 map 的 entry 的删除的
求大神指导:D
]]>2TMRespnse 类 是泛型类 public class TMResponse<T>
3 在 kotlin 中使用 getUploadConfig("111", object : RxResultCallback<TMResponse<Any>>()
就报 上面的错,object : RxResultCallback<TMResponse<Any>>() 这里应该怎么写 呢?
]]> val numbers1 = mutableListOf(0, 1, 2, 3, 4) val numbers2 = mutableListOf(5, 6, 7, 8, 9) println("numbers : ${numbers1.zip(numbers2) { a, b -> a + b }}") println("numbers add {} : ${numbers1.zip(numbers2) { a, b -> { a + b } }}") //println //numbers : [5, 7, 9, 11, 13] //numbers add {} : [() -> kotlin.Int, () -> kotlin.Int, () -> kotlin.Int, () -> kotlin.Int, () -> kotlin.Int]
今天无意遇到一个问题,使用 zip 时一直报 null,检查好久后才发现多了一个花括号。 看了半天始终没明白,为什么匿名函数内多加一个花括号会导致返回 Unit?
]]>这个项目是采用 Kotlin 语言, 在 Vert.x 基础上, 专注于后端 api 接口的快速开发框架.
框架介绍: http://loveinshenzhen.github.io/#/sz_framework/introduction
希望对使用 kotlin 进行后端开发的同学, 有兴趣可以看看文档介绍, 运行一下 sample 体验一下.
有想进行技术交流的同学, 可以加我的微信, 验证申请时请填入: kotlin
微信号: dragonsunmoon