Skip to content

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实现)

本站访客数 人次      本站总访问量