决定在我的新 Jetpack Compose 项目中尝试Material Design 3 。一切都很舒适,直到我碰壁时需要展示一个 Snackbar。
在MD2中,这非常简单,您可以在使用SnackbarHostState.showSnackbar()协程作用域内的函数完成的支架中显示小吃栏。我观察到您只需要从androidx.compose.material.rememberScaffoldState材质库导入即可。
import androidx.compose.material.rememberScaffoldState
@Composable
fun MyScreenInMaterial2() {
val scaffoldState = rememberScaffoldState()
}
Run Code Online (Sandbox Code Playgroud)
当我在MD3中尝试相同的操作时,该rememberScaffoldState()功能未得到解析。

对于那些深入了解 MD3 世界的人来说,如何在脚手架中显示 Snackbar?我已经检查了文档和在线资源,但没有找到解决方案。
我在 Sealed 类中编写了这 3 个游戏状态:
sealed class Status {
object Idle : Status()
object Active : Status()
object GameOver : Status()
}
Run Code Online (Sandbox Code Playgroud)
IDE 建议我应该使用 adata object而不是object.
问题是我从来没有听说过data object。我环顾四周,没有找到与 相关的可靠解释data object。例如,这个2015 年的答案表明这是一个错误!
我正在寻找您的想法 data object及其用法。
我正在使用 Espresso 进行仪器测试,但在堆栈跟踪上出现此错误:

该错误是由于缺少类引起的,如下所示:
Caused by: java.lang.ClassNotFoundException: Didn't find class "org.hamcrest.Matchers" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/android.test.mock.jar", zip file "/system/framework/android.test.base.jar", zip file "/data/app/~~vnZzxGNKnS4V6YkEf4falA==/com.example.android.architecture.blueprints.reactive.test-K_x0_yJ0hJeDHaJkDmHXRw==/base.apk", zip file "/data/app/~~oeYx2MgTcILbk-vq_WPx1A==/com.example.android.architecture.blueprints.reactive-0wMHYEe95hx_1cnbdAoZAw==/base.apk"],nativeLibraryDirectories
Run Code Online (Sandbox Code Playgroud)
它首先发生在我在片段测试中添加此代码后:

这些是我在 Gradle 上的相关库:

我有这些进口:
import androidx.fragment.app.testing.launchFragmentInContainer
import androidx.test.espresso.Espresso.onView
import androidx.test.espresso.assertion.ViewAssertions.matches
import androidx.test.espresso.matcher.ViewMatchers.*
import androidx.test.ext.junit.runners.AndroidJUnit4
import org.hamcrest.core.IsNot.not
Run Code Online (Sandbox Code Playgroud) dependencies android gradle android-testing android-espresso
我正在开发一个 Jetpack 项目,该项目使用 Coil Library 从 API 下载图像。
我已确认 API 调用已成功返回有效的图像 URL 和相关数据。我可以使用返回的 URL 在浏览器上查看图像。
这是我的图像可组合项:
@Composable
fun AstroPhoto(picture: AstroPicture) {
val imgUrl = picture.url.toUri()
.buildUpon()
.scheme("https")
.build()
AsyncImage(model = ImageRequest.Builder(LocalContext.current)
.data(imgUrl)
.size(Size.ORIGINAL)
.crossfade(true).build(),
placeholder = painterResource(R.drawable.loading_animation),
contentDescription = picture.title,
contentScale = ContentScale.Crop,
)
}
Run Code Online (Sandbox Code Playgroud)
我将上面的图像称为可组合在惰性列中:
....
Box( ... ) {
LazyColumn(content = {
items(state.astroPictures) {
AstroPhoto(picture = it)
} })
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的异常:
致命异常:主进程:com.uxstate,PID:31790 java.lang.IllegalArgumentException:仅支持 VectorDrawables 和光栅化资源类型。PNG、JPG 位于 androidx.compose.ui.res.PainterResources_androidKt.loadVectorResource(PainterResources.android.kt:93)
我正在compose_version = '1.1.1'与kotlin_version = '1.6.10'. 我的线圈版本是"io.coil-kt:coil-compose:2.1.0" …
我正在按照Material Design尝试 Android 的 BottomNavigationView 实现
但是,在 MainActivity 代码上,我收到一条OnNavigationItemSelectedListener已弃用的警告- 请参阅下面的快照
尝试使用另一种方法来处理 BottomNavigationView,但我找不到它。
寻求任何有出路的人的帮助,但与此同时,我已将我的 BottomView 的菜单项 ID 与片段目标 ID 进行了匹配,并且我成功实现了导航,但存在无法使用片段名称更新我的工具栏标题的限制。
我正在关注这个YouTubeModifier.preferredSize()教程,他们在盒子和间隔可组合项上使用Modifier.preferredHeight()- 所有其他链接的修饰符都很好。
但是 Android Studio 无法识别这两个选项。
这是我正在使用的代码:
Column() {
var isBlue by remember { mutableStateOf(false) }
val color = if(isBlue) Color.Blue else Color.Green
Button(onClick = { isBlue = !isBlue }) {}
Spacer(modifier = Modifier.preferredHeight(128.dp))
Box(modifier = Modifier.preferredHeight(128.dp).background(color = color)){}
}
Run Code Online (Sandbox Code Playgroud)
编辑强调preferredHeight尚未解决。
这是来自 IDE 的透视图。
我正在使用compose_version = '1.0.1'AS Arctic Fox
我正在关注Jetpack Compose Codelab 中的测试,但无法使用节点上的函数打印语义树。printToLog我在包内使用此代码androidTest。
import androidx.compose.ui.test.printToLog
...
//testing function
@Test
fun rallyTopAppBarTest() {
val allScreen = RallyScreen.values().toList()
testRule.setContent {
//the component be tested in isolation goes here
RallyTopAppBar(
allScreens = allScreen,
onTabSelected = {},
currentScreen = RallyScreen.Accounts
)
}
testRule.onRoot().printToLog("currentLabelExists")
....
}
Run Code Online (Sandbox Code Playgroud)
我已使用标签检查了我的 LogCat 的调试和详细过滤"currentLabelExists",但语义树未打印在日志上。
关于我可能会错过什么的任何想法。
android android-jetpack-compose android-jetpack-compose-testing
我正在尝试 Android WorkManager,它每 15 分钟就会成功触发一次。
但是,工作尚未完成,我在日志中收到此错误。
I/WM-WorkerWrapper: Worker result FAILURE for Work
这就是我设置Constraints(在应用程序类内部)来触发工作的方式。
//set-up work
private fun setUpAsteroidLoadingWork() {
//define work constraints
val workConstraints =
Constraints.Builder()
.setRequiredNetworkType(NetworkType.UNMETERED)
.setRequiresCharging(false)
.build()
//create WorkRequest
val workRequest = PeriodicWorkRequestBuilder<LoadAsteroidsWorker>(15, TimeUnit.MINUTES)
.setConstraints(
workConstraints)
.build()
//get WorkManager
val workManager = WorkManager.getInstance(this)
//enqueue work
workManager.enqueueUniquePeriodicWork(
LoadAsteroidsWorker.WORK_NAME, ExistingPeriodicWorkPolicy.KEEP, workRequest)
}
Run Code Online (Sandbox Code Playgroud)
onCreate()我在应用程序类方法中开始工作
override fun onCreate() {
super.onCreate()
//initialize Timber
Timber.plant(Timber.DebugTree())
Timber.i("Application's onCreate Called")
//start work inside onCreate
runWorkInBackground()
}
//switch work to run on background
private …Run Code Online (Sandbox Code Playgroud) 我有这个 TextFied 可组合项,同时包含KeyboardOptions和KeyboardActions。
@Composable
fun TodoInputText(...) {
val keyboardController = LocalSoftwareKeyboardController.current
TextField( ....
onValueChange = onTextChanged,
keyboardOptions = KeyboardOptions.Default.copy(imeAction = ImeAction.Done),
keyboardActions = KeyboardActions(onDone = {
onImeAction()
keyboardController?.hide()
}))}
Run Code Online (Sandbox Code Playgroud)
TextField 正在与 Done Action 配合使用,但只要 TextFied 为空,我就需要在键盘上禁用 Done ImeAction,如此 GIF 所示
我已经提取了一个状态来检查 TextField 是否为空。
@Composable
fun TodoItemEntryInput(...) {
//hold state for TextField
val (text, setText) = remember { mutableStateOf("") }
val isTextBlank = text.isNotBlank()
//declare lambda function submit that handles a submit event when done is pressed …Run Code Online (Sandbox Code Playgroud) android ×9
android-jetpack-compose-testing ×1
android-room ×1
coil ×1
dependencies ×1
gradle ×1
kotlin ×1