边写软件边学kotlin(一):Kotlin语法初认识:

前言:我认为kotlin语言和前端三剑客本质上并无多大区别,都是写页面的语言。kotlin语言中使用了大量的语法糖来加速页面开发,这门语言的功能性较强

(一)

kotlin 复制代码
data class ZhipuRequest(
    val model: String = "glm-4v", // 使用具备视觉能力的模型
    val messages: List<ZhipuMessage>
)
  1. 在class前定义data,那么这个类就会自动生成hashCode(),toString()等方法
  2. val在kotlin中是常量的意思,类比java中的final
  3. kotin的变量命名方式是"变量名:数据类型"

(二)

kotlin 复制代码
val text: String? = null
  1. 定义text变量,数据类型是String
  2. String? 的意思是这个变量本身可能为空,= null是把text变量初始值设为null

(三)

kotlin 复制代码
interface AiApiService {
    @POST("chat/completions")
    suspend fun analyzeResume(
        @Header("Authorization") token: String, // 放入你的 API Key
        @Body request: ZhipuRequest
    ): Response<ResponseBody> // 先用 ResponseBody 接收原始字符串,方便调试
}
  1. interface 接口名。定义一个接口
  2. @POST("chat/completions"),定义一个访问路径
  3. suspend表示异步
  4. fun表示定义一个函数,函数内是两个注解参数,第一个是在HTTP请求的请求头中添加一个Authorization字段,将String类型的token变量与这个键绑定,第二个是将ZhipuRequest类型的request对象转换成json数据,放入请求体中
  5. :Response< ResponseBody >,代表这个analyzeResume函数的返回值是一个Response< ReponseBody>类型的数据

(四)

kotlin 复制代码
object RetrofitClient {
    private const val BASE_URL = "https://open.bigmodel.cn/api/paas/v4/"

    val instance: AiApiService by lazy {
        Retrofit.Builder()
            .baseUrl(BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .build()
            .create(AiApiService::class.java)
    }
}
  1. Object{}:是一个匿名对象,当你需要这个对象,却又懒的写类名,并且复用的少的时候可以使用它
  2. by lazy{}:懒加载,软件初始化的时候先不创建它,等到需要用它的时候再创建它,这是为了降低页面初始化时间
  3. Retrofit:是一个处理网络请求的库,作为客户端访问AI的网络请求的请求中转站
  4. .Builder():构造器模式,优雅的创建对象

(五)

kotlin 复制代码
(1..150).map {Question(id = it, title = "[$category] 第 $it 题", answer = "", category = category, passRate = "${(60..95).random()}%")
  1. (1...150):是一个语法唐,直观表示从1到150的区间
  2. map:不是一种数据结构,而是一个函数映射工具,负责将前面的数据(1...150)循环映射进后面的数据(Question类数据)
  3. it:是对(1...150)的每一个元素的别名,类似于Java中的
java 复制代码
for (String s : Str){
 s = "牛逼666"
}

的s变量

(六)

kotlin 复制代码
@Composable
fun ProfileSectionCard(title: String, content: @Composable ColumnScope.() -> Unit) {
    Card(modifier = Modifier.fillMaxWidth(), colors = CardDefaults.cardColors(containerColor = Color.White), shape = RoundedCornerShape(12.dp)) {
        Column(modifier = Modifier.padding(16.dp)) {
            Text(text = title, fontWeight = FontWeight.Bold, fontSize = 15.sp)
            Spacer(modifier = Modifier.height(12.dp))
            content()
        }
    }
}
  1. @Composable:组件注解,声明下方的方法会直接渲染组件在页面上
  2. content: @Composable ColumnScope.() -> Unit :接收一个content参数,也就是这个卡片的主体内容。.() 代表不接受任何参数,->Unit 代表没有任何返回值,只执行UI渲染操作 ColumnScope代表卡片的主体内容必须要按照竖直方向排列
  3. Card():代表接下来要创建一个卡片容器
  4. modifier :控制容器的长相,比如这里的modifier = Modifier.fillMaxWidth()就是让Card这个卡片容器填满宽度

(七)

kotlin 复制代码
Column(
            modifier = Modifier.padding(16.dp)
        ) {
            Text(text = title, fontWeight = FontWeight.Bold, fontSize = 15.sp)
            Spacer(modifier = Modifier.height(12.dp))
            content()
        }
  1. Column:创建一个列容器
  2. Modifier.padding(16.dp):将这个容器的上下左右都与边界隔开16像素
  3. Column()后面的大括号:大括号里面的内容,就是在这个容器里面的东西,有Text文本,也有content()
  4. Spacer:创造一个间隔容器,将Text与content()内容空隔开12像素

(八)

kotlin 复制代码
Column(
            modifier = Modifier.fillMaxSize(),
            verticalArrangement = Arrangement.Center,
            horizontalAlignment = Alignment.CenterHorizontally
        ) {
            Icon(
                imageVector = icon,
                contentDescription = null,
                tint = color,
                modifier = Modifier.size(40.dp)
            )
            Spacer(modifier = Modifier.height(12.dp))
            Text(
                text = title,
                // 这里是关键:确保 fontWeight 与意向页保持一致
                // 如果觉得太粗,就把 FontWeight.Bold 改为 FontWeight.SemiBold
                style = MaterialTheme.typography.titleMedium,
                fontWeight = FontWeight.Bold,
                fontSize = 16.sp
            )
        }
  1. Icon:创建一个标签
  2. verticalArrangemnet:表示该容器放置的位置是垂直居中
  3. horizontalAlignment :表示该容器放置的位置是水平居中
  4. tint:该标签的颜色
  5. style = MaterialTheme.typography.titleMedium:在全局的"样式"容器中获取所有"字体",titleMedium就是具体的名字

(九)

kotlin 复制代码
@OptIn(ExperimentalMaterial3Api::class)
  1. @Optln :一种声明,是告诉编译器我现在要用一些正处在实验阶段的功能代码
  2. ExperimentalMaterial3Api:正处在实验性阶段的Material3库的API
  3. ::class:kotlin的类引用方式

(十)

kotlin 复制代码
val backgroundPath = remember { Path() }

remember:捕捉Path()对象的变化,使得在页面刷新时能够一直保存Path的地址,不至于每次刷新都新创建一个Path对象

(十一)

kotlin 复制代码
for (level in 1..3) 

level就类似于Java中的

java 复制代码
for(int i = 0; i < 5; i++){
}

i

(十二)

java 复制代码
backgroundPath.reset() 
backgroundPath.close()
  1. .reset() :一键清空绘图板
  2. .close():关闭绘图板

(十三)

java 复制代码
if (data.any { it > 0f }) 

.any: 自动遍历data列表,只要有一个元素满足括号里面的条件,就返回true,如果没有元素符合,那么就返回false

(十四)

kotlin 复制代码
FileOutputStream(file).use { output -> input.copyTo(output) }

.use:就是让前面的对象执行后面大括号里的逻辑

Canvas:是供绘画的画布

Box:盒子容器

Button:按钮容器

Dialog:对话框

Colunm:内部进行列排放的容器

Row:内部进行横向排放的容器

scaffold:脚手架,也就是说这个容器内部预留了几个位置,例如bottomBar,

?.:如果前面的值不为空则执行后面的逻辑,例如:

kotlin 复制代码
data?.split(",") -如果data不为空,则将data以","分割

?:: 如果前面的值为空,则赋入后面的值(或执行后面的逻辑),例如:

kotlin 复制代码
ImageUtils.uriToBase64(context, resumeUri!!)?: return@launch 如果为空,则执行return@launch逻辑

return@launch:launch是一段协程,return@launch就是退出这个协程

相关推荐
Mr YiRan3 小时前
C++面向对象继承与操作符重载
开发语言·c++·算法
普通网友5 小时前
Android Jetpack 架构组件最佳实践之“网抑云”APP
android·架构·android jetpack
普通网友5 小时前
原创_Android Jetpack Compose 最全上手指南
android·android jetpack
FDoubleman5 小时前
Android Jetpack之Compose入门(一)
android·android jetpack
普通网友5 小时前
Android Jetpack从入门到精通,干货满满
android·android jetpack
子云心6 小时前
Android Jetpack 系列(七)App Startup 启动优化
android·android jetpack·jetpack·initializer·startup·appstartup
嫩嫩的猿6 小时前
android jetpack compose Model对象更新变量 UI不更新、不刷新问题
android·ui·android jetpack
普通网友6 小时前
Android Jetpack 之 LifeCycle 组件_android 自定义view lifecycle
android·gitee·android jetpack
一只鹿鹿鹿6 小时前
智慧水利一体化建设方案
大数据·运维·开发语言·数据库·物联网