Kotlin Multiplatform Compose简单教程
更新: 6/5/2025 字数: 0 字 时长: 0 分钟
Kotlin Multiplatform Compose是Jetbrain基于现有的Google Jetpack Compose进行二次开发的用于Kotlin Multiplatform的UI框架,其希望可以使用原本Jetpack Compose的开发方式来对KMP的所有端进行UI绘制,底层基于Skia框架进行UI层面的渲染。
渲染过程
使用Room连接本地数据库
Room是Android开发中常用的连接本地数据库的包,其具体是对于原本的SqlLite进行在封装,在2.7.0之后,Room对kMP进行了支持,使得KMP可以使用Android开发的方式来进行跨端开发
首先引入依赖
kotlin
plugins{
alias(libs.plugins.ksp)
alias(libs.plugins.room)
}
//room
commonMain.dependencies{
implementation(libs.androidx.room.runtime)
implementation(libs.sqlite.bundled)
}
dependencies {
debugImplementation(compose.uiTooling)
add("kspAndroid", libs.androidx.room.compiler)
add("kspCommonMainMetadata", libs.androidx.room.compiler)
add("kspDesktop",libs.androidx.room.compiler)
}
room{
schemaDirectory("$projectDir/schemas")
}
然后在Common下创建两个用于使用ksp生成代码的类
kotlin
//AppDatabase.kt
@Database(entities = [Todo::class], version = 1, exportSchema = true)
@ConstructedBy(AppDatabaseConstructor::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun todoDao(): TodoDao
}
// The Room compiler generates the `actual` implementations.
@Suppress("NO_ACTUAL_FOR_EXPECT")
expect object AppDatabaseConstructor : RoomDatabaseConstructor<AppDatabase> {
override fun initialize(): AppDatabase
}
kotlin
//CreateDatabase.kt
class CreateDatabase(
private val builder:RoomDatabase.Builder<AppDatabase>
){
fun getDateBase():AppDatabase{
return builder
.fallbackToDestructiveMigration(true)
.setDriver(BundledSQLiteDriver())
.setQueryCoroutineContext(Dispatchers.IO)
.build()
}
}
再在Android包下创建具体的实现
kotlin
//AndroidDatabaseBuilder.kt
fun androidDatabaseBuilder(ctx: Context): RoomDatabase.Builder<AppDatabase> {
val appContext = ctx.applicationContext
val dbFile = appContext.getDatabasePath("todo.db")
return Room.databaseBuilder<AppDatabase>(
context = appContext,
name = dbFile.absolutePath
)
}
还有desktop端
kotlin
//DesktopDatabaseBuilder.kt
fun desktopDatabaseBuilder(): RoomDatabase.Builder<AppDatabase> {
val dbFile = File(System.getProperty("java.io.tmpdir"), "todo.db")
return Room.databaseBuilder<AppDatabase>(
name = dbFile.absolutePath,
)
}
值得注意的是,目前Room仅支持Desktop,Android,ios三端的本地数据库连接,Web端支持尚且还在孵化中(据说时使用LocalStorage实现)