小编Cha*_*ejo的帖子

投射 LocalContext.current 时的 Jetpack Compose 预览渲染问题

Android Studio Chipmunk 2021.2.1; \nCompose Version = \'1.1.1\'; \nGradle  Version 7.4.2; \nKotlin 1.6.10;\n
Run Code Online (Sandbox Code Playgroud)\n

直到某一时刻,一切都正常。然后,当我尝试在此项目和另一个项目中调用“LocalContext.current”并将“context.applicationContext 作为应用程序”时,出现此错误并且预览停止工作。它曾经与“LocalContext.current”一起使用的地方

\n

尝试过不同版本的 Compose、kotlin、gradle。

\n

渲染问题

\n
\n

java.lang.ClassCastException: 类\ncom.android.layoutlib.bridge.android.BridgeContext 无法转换为\n类 android.app.Application\n(com.android.layoutlib.bridge.android.BridgeContext 和\nandroid.app.应用程序位于 loader\ncom.intellij.ide.plugins.cl.PluginClassLoader @3a848149) \xc2\xa0\xc2\xa0at\ncom.client.personalfinance.screens.ComposableSingletons$AccountScreenKt$lambda-2$1.invoke( AccountScreen.kt:136)\n\xc2\xa0\xc2\xa0at\ncom.client.personalfinance.screens.ComposableSingletons$AccountScreenKt$lambda-2$1.invoke(AccountScreen.kt:133)\n\xc2\xa0\xc2 \xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm. kt:34)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.material.MaterialTheme_androidKt.PlatformMaterialTheme(MaterialTheme.android.kt:23)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.material。 MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:82)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.material.MaterialThemeKt$MaterialTheme$1$1.invoke(MaterialTheme.kt:81)\n\xc2\ xa0\xc2\xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:107)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda .jvm.kt:34)\n\xc2\xa0\xc2\xa0at\nandroidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)\n\xc2\xa0\xc2\xa0at androidx.compose.material。 TextKt.ProvideTextStyle(Text.kt:265

\n
\n
@Preview(showBackground = true) \n@Composable fun PrevAccountScreen() {\n    val context  = LocalContext.current\n    val mViewModel: MainViewModel =\n             viewModel(factory = MainVeiwModelFactory(context.applicationContext as Application))\n    AccountScreen(navController = rememberNavController(), viewModel = mViewModel)\n }\n
Run Code Online (Sandbox Code Playgroud)\n

kotlin android-studio android-jetpack-compose android-jetpack-compose-preview

6
推荐指数
1
解决办法
7941
查看次数

使用 Hilt 预填充 Room 数据库,无需创建额外的数据库实例

我试图确保我的数据库始终包含初始行。我通读了如何在首次运行时填充 Android Room 数据库表?我遇到的主要问题是,在创建数据库时,我没有可以使用 Hilt 访问的实例(或者我不知道如何访问它?)。如果我尝试重新使用provideDatabase我编写的 Hilt 方法,则会导致 SQLite 数据库泄漏(大概是因为周围没有人使用这些生成的实例来关闭数据库)。这是我的代码:

@Module
@InstallIn(ApplicationComponent::class)
object AppModule {

    @Singleton
    @Provides
    fun provideDatabase(@ApplicationContext context: Context): GameDatabase {
        return Room.databaseBuilder(context, GameDatabase::class.java, GameDatabase.GAME_DB_NAME)
            .addCallback(
                object : RoomDatabase.Callback() {
                    override fun onCreate(db: SupportSQLiteDatabase) {
                        super.onCreate(db)
                        // Initialize the database with the first game
                        ioThread {
                            provideDatabase(context).gameDao().createNewGame(Game())
                        }
                    }

                    override fun onOpen(db: SupportSQLiteDatabase) {
                        super.onOpen(db) 

                        // Ensure there is always one game in the database
                        // This will capture the case of the app …
Run Code Online (Sandbox Code Playgroud)

android android-room dagger-hilt

3
推荐指数
1
解决办法
1848
查看次数