我读到了Jetpack Compose Preview Render Problem when casting LocalContext.current,我想知道是否有一种方法可以在不实现接口的情况下解决这个问题.

我在跟踪https://developer.android.com/codelabs/basic-android-kotlin-compose-practice-sports-app?continue=https%3A%2F%2Fdeveloper.android.com%2Fcourses%2Fpathways%2Fandroid-basics-compose-unit-4-pathway-3%23codelab-https%3A%2F%2Fdeveloper.android.com%2Fcodelabs%2Fbasic-android-kotlin-compose-practice-sports-app#1

代码在此处:https://github.com/google-developer-training/basic-android-kotlin-compose-training-sports/tree/starter

我的更改:

diff --git a/AndroidBasicsCourse/Sports/app/src/main/java/com/example/sports/ui/SportsScreens.kt b/AndroidBasicsCourse/Sports/app/src/main/java/com/example/sports/ui/SportsScreens.kt
index 7a24a19..e9d96f4 100644
--- a/AndroidBasicsCourse/Sports/app/src/main/java/com/example/sports/ui/SportsScreens.kt
+++ b/AndroidBasicsCourse/Sports/app/src/main/java/com/example/sports/ui/SportsScreens.kt
@@ -16,6 +16,7 @@
 
 package com.example.sports.ui
 
+import android.app.Activity
 import androidx.activity.compose.BackHandler
 import androidx.compose.foundation.Image
 import androidx.compose.foundation.background
@@ -48,6 +49,7 @@ import androidx.compose.material3.Surface
 import androidx.compose.material3.Text
 import androidx.compose.material3.TopAppBar
 import androidx.compose.material3.TopAppBarDefaults
+import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.collectAsState
 import androidx.compose.runtime.getValue
@@ -56,6 +58,7 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Brush
 import androidx.compose.ui.graphics.Color
 import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.platform.LocalContext
 import androidx.compose.ui.platform.LocalLayoutDirection
 import androidx.compose.ui.res.dimensionResource
 import androidx.compose.ui.res.painterResource
@@ -76,6 +79,8 @@ import com.example.sports.ui.theme.SportsTheme
  */
 @Composable
 fun SportsApp(
+    windowSize: WindowWidthSizeClass,
+    modifier: Modifier = Modifier
 ) {
     val viewModel: SportsViewModel = viewModel()
     val uiState by viewModel.uiState.collectAsState()
@@ -342,6 +347,48 @@ private fun SportsDetail(
     }
 }
 
+@Composable
+fun SportsListAndDetails(
+    uiState: SportsUiState,
+    viewModel: SportsViewModel,
+    modifier: Modifier = Modifier
+) {
+    val activity = LocalContext.current as Activity
+
+    Scaffold(
+        topBar = {
+            SportsAppBar(
+                isShowingListPage = true,
+                onBackButtonClick = { activity.finish() },
+            )
+        }
+    ) { innerPadding ->
+        Row(modifier = modifier) {
+            SportsList(
+                sports = uiState.sportsList,
+                onClick = {
+                    viewModel.updateCurrentSport(it)
+                    viewModel.navigateToDetailPage()
+                },
+                contentPadding = innerPadding,
+                modifier = Modifier
+                    .fillMaxWidth()
+                    .padding(
+                        top = dimensionResource(R.dimen.padding_medium),
+                        start = dimensionResource(R.dimen.padding_medium),
+                        end = dimensionResource(R.dimen.padding_medium),
+                    )
+            )
+            SportsDetail(
+                selectedSport = uiState.currentSport,
+                contentPadding = innerPadding,
+                onBackPressed = { activity.finish() },
+                modifier = Modifier.weight(1f)
+            )
+        }
+    }
+}
+
 @Preview
 @Composable
 fun SportsListItemPreview() {
@@ -365,3 +412,15 @@ fun SportsListPreview() {
         }
     }
 }
+
+@Preview
+@Composable
+fun SportsListAndDetailsPreview() {
+    SportsTheme {
+        Surface {
+            val viewModel: SportsViewModel = viewModel()
+            val uiState by viewModel.uiState.collectAsState()
+            SportsListAndDetails(uiState = uiState, viewModel = viewModel)
+        }
+    }
+}

尽管预览不会渲染.如果我移除/注释掉val activity = LocalContext.current as Activity,那么渲染就会工作.

有什么 idea 吗?

我不想查看代码实验室中的代码解决方案,因为我想了解如何在这些问题再次发生时对其进行调试.

推荐答案

预览在桌面操作系统上渲染:Linux、Mac OS或Windows.

与单元测试类似,一些特定于Android的类,如Activity,在预览中不可用.

我建议您重构您的SportsListAndDetails()可组合元素,接受一个onFinish: () -> Unit = {} lambda参数(您调用它来代替activity.finish()),并在您没有预览的地方让onFinish调用finish().

Android相关问答推荐

致命异常:java.lang. SecureExcellent::用户10021和当前进程都没有android. permissions.Change_WIFI_STATE

以编程方式更改Android应用程序上的文件许可

懒惰列的滚动到项目不按预期工作'

如何完全隐藏的元素堆叠在CardView?

房间DB:UPSERT返回什么?

try 用Jetpack Compose理解视图模型和导航

尽管我们不再使用GCM SDK,但应用程序已被标记为使用GCM SDK

BroadCastReceiver的onReceive方法中的Intent上的Extras为空

由于Xcode运行脚本阶段没有指定输出,在IOS Emulator中的KMM项目中生成失败

在本地通知中设置自定义声音

是否可以按照干净的体系 struct 将活动实例传递给视图模型

如何在 JetpackCompose 的 LazyColumn 中 Select 多个项目

在移动设备上看到时如何增加 PasswordField 文本?

观察软键盘可见性,打开/关闭 Jetpack Compose

我的观点在jetpack compose中相互重叠

新的内部测试应用程序版本不适用于测试人员,即使它说它们是

如何使用jetpack compose实现布局,其中图标在列布局上是绝对位置

如何根据加载图像的 colored颜色 绘制边框?

Android Studio,Db 连接错误:发生异常情况导致驱动程序失败.请报告此异常

未解决的参考:getIntentSender / try 在 Jetpack Compose 中获取电话号码时