代码之家  ›  专栏  ›  技术社区  ›  crawlingdev

未解析的引用:backgroundColor

  •  0
  • crawlingdev  · 技术社区  · 2 年前

    我正在学习Kotlin移动应用程序开发,并在上关注谷歌代码实验室 https://developer.android.com/codelabs/basic-android-kotlin-compose-woof-animation? 。这是我显示狗列表的代码:

    /*
     * Copyright (C) 2023 The Android Open Source Project
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      https://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package com.example.woof
    
    import android.os.Bundle
    import androidx.activity.ComponentActivity
    import androidx.activity.compose.setContent
    import androidx.annotation.DrawableRes
    import androidx.annotation.StringRes
    import androidx.compose.foundation.Image
    import androidx.compose.foundation.layout.Column
    import androidx.compose.foundation.layout.Row
    import androidx.compose.foundation.layout.fillMaxSize
    import androidx.compose.foundation.layout.fillMaxWidth
    import androidx.compose.foundation.layout.padding
    import androidx.compose.foundation.layout.size
    import androidx.compose.foundation.lazy.LazyColumn
    import androidx.compose.foundation.lazy.items
    import androidx.compose.foundation.layout.Spacer
    import androidx.compose.material3.Card
    import androidx.compose.material3.CenterAlignedTopAppBar
    import androidx.compose.material3.MaterialTheme
    import androidx.compose.material3.Scaffold
    import androidx.compose.material3.Surface
    import androidx.compose.material.icons.filled.ExpandMore
    import androidx.compose.material.icons.Icons
    import androidx.compose.material.icons.filled.ExpandLess
    import androidx.compose.material3.Icon
    import androidx.compose.material3.IconButton
    import androidx.compose.material3.Text
    import androidx.compose.animation.animateContentSize
    import androidx.compose.animation.animateColorAsState
    import androidx.compose.animation.core.Spring
    import androidx.compose.animation.core.spring
    import androidx.compose.runtime.Composable
    import androidx.compose.runtime.getValue
    import androidx.compose.runtime.mutableStateOf
    import androidx.compose.runtime.remember
    import androidx.compose.runtime.setValue
    import androidx.compose.ui.Alignment
    import androidx.compose.ui.Modifier
    import androidx.compose.ui.draw.clip
    import androidx.compose.ui.layout.ContentScale
    import androidx.compose.ui.res.dimensionResource
    import androidx.compose.ui.res.painterResource
    import androidx.compose.ui.res.stringResource
    import androidx.compose.ui.tooling.preview.Preview
    import com.example.woof.data.Dog
    import com.example.woof.data.dogs
    import com.example.woof.ui.theme.WoofTheme
    
    class MainActivity : ComponentActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContent {
                WoofTheme {
                    // A surface container using the 'background' color from the theme
                    Surface(
                        modifier = Modifier.fillMaxSize()
                    ) {
                        WoofApp()
                    }
                }
            }
        }
    }
    
    /**
     * Composable that displays an app bar and a list of dogs.
     */
    @Composable
    fun WoofApp() {
        Scaffold(
            topBar = {
                WoofTopAppBar()
            }
        ) { it ->
            LazyColumn(contentPadding = it) {
                items(dogs) {
                    DogItem(
                        dog = it,
                        modifier = Modifier.padding(dimensionResource(R.dimen.padding_small))
                    )
                }
            }
        }
    }
    
    /**
     * Composable that displays a list item containing a dog icon and their information.
     *
     * @param dog contains the data that populates the list item
     * @param modifier modifiers to set to this composable
     */
    @Composable
    fun DogItem(
        dog: Dog,
        modifier: Modifier = Modifier
    ) {
        var expanded by remember { mutableStateOf(false) }
        val color by animateColorAsState(
            targetValue = if (expanded) MaterialTheme.colorScheme.tertiaryContainer
            else MaterialTheme.colorScheme.primaryContainer,
        )
    
        Card(
            modifier = modifier
        ) {
            Column(modifier = Modifier .animateContentSize(
                animationSpec = spring(
                dampingRatio = Spring.DampingRatioNoBouncy,
                stiffness = Spring.StiffnessMedium
            )
            )
                .backgroundColor(color=color)
            ){
                Row(
                    modifier = Modifier
                        .fillMaxWidth()
                        .padding(dimensionResource(R.dimen.padding_small))
                ) {
                    DogIcon(dog.imageResourceId)
                    DogInformation(dog.name, dog.age)
                    Spacer(modifier = Modifier.weight(1f))
                    DogItemButton(
                        expanded = expanded,
                        onClick = { expanded = !expanded }
                    )
                }
                if (expanded) {
                    DogHobby(
                        dog.hobbies, modifier = Modifier.padding(
                            start = dimensionResource(R.dimen.padding_medium),
                            top = dimensionResource(R.dimen.padding_small),
                            end = dimensionResource(R.dimen.padding_medium),
                            bottom = dimensionResource(R.dimen.padding_medium)
                        )
                    )
                }
            }
        }
    }
    
    @Composable
    private fun DogItemButton(
        expanded: Boolean,
        onClick: () -> Unit,
        modifier: Modifier = Modifier
    ){
        IconButton(
            onClick = onClick,
            modifier = modifier
        ){
            Icon(
                imageVector = if (expanded) Icons.Filled.ExpandLess else Icons.Filled.ExpandMore,
                contentDescription = stringResource(R.string.expand_button_content_description),
                tint = MaterialTheme.colorScheme.secondary
            )
        }
    
    }
    
    @Composable
    fun DogHobby(
        @StringRes dogHobby: Int,
        modifier: Modifier = Modifier
    ){
        Column(
            modifier = modifier
        ) {
            Text(
                text = stringResource(R.string.about),
                style = MaterialTheme.typography.labelSmall
            )
            Text(
                text = stringResource(dogHobby),
                style = MaterialTheme.typography.bodyLarge
            )
        }
    }
    
    
    
    /**
     * Composable that displays a Top Bar with an icon and text.
     *
     * @param modifier modifiers to set to this composable
     */
    @Composable
    fun WoofTopAppBar(modifier: Modifier = Modifier) {
        CenterAlignedTopAppBar(
            title = {
                Row(
                    verticalAlignment = Alignment.CenterVertically
                ) {
                    Image(
                        modifier = Modifier
                            .size(dimensionResource(R.dimen.image_size))
                            .padding(dimensionResource(R.dimen.padding_small)),
                        painter = painterResource(R.drawable.ic_woof_logo),
    
                        // Content Description is not needed here - image is decorative, and setting a
                        // null content description allows accessibility services to skip this element
                        // during navigation.
    
                        contentDescription = null
                    )
                    Text(
                        text = stringResource(R.string.app_name),
                        style = MaterialTheme.typography.displayLarge
                    )
                }
            },
            modifier = modifier
        )
    }
    
    /**
     * Composable that displays a photo of a dog.
     *
     * @param dogIcon is the resource ID for the image of the dog
     * @param modifier modifiers to set to this composable
     */
    @Composable
    fun DogIcon(
        @DrawableRes dogIcon: Int,
        modifier: Modifier = Modifier
    ) {
        Image(
            modifier = modifier
                .size(dimensionResource(R.dimen.image_size))
                .padding(dimensionResource(R.dimen.padding_small))
                .clip(MaterialTheme.shapes.small),
            contentScale = ContentScale.Crop,
            painter = painterResource(dogIcon),
    
            // Content Description is not needed here - image is decorative, and setting a null content
            // description allows accessibility services to skip this element during navigation.
    
            contentDescription = null
        )
    }
    
    /**
     * Composable that displays a dog's name and age.
     *
     * @param dogName is the resource ID for the string of the dog's name
     * @param dogAge is the Int that represents the dog's age
     * @param modifier modifiers to set to this composable
     */
    @Composable
    fun DogInformation(
        @StringRes dogName: Int,
        dogAge: Int,
        modifier: Modifier = Modifier
    ) {
        Column(modifier = modifier) {
            Text(
                text = stringResource(dogName),
                style = MaterialTheme.typography.displayMedium,
                modifier = Modifier.padding(top = dimensionResource(R.dimen.padding_small))
            )
            Text(
                text = stringResource(R.string.years_old, dogAge),
                style = MaterialTheme.typography.bodyLarge
            )
        }
    }
    
    /**
     * Composable that displays what the UI of the app looks like in light theme in the design tab.
     */
    @Preview
    @Composable
    fun WoofPreview() {
        WoofTheme(darkTheme = false) {
            WoofApp()
        }
    }
    
    /**
     * Composable that displays what the UI of the app looks like in dark theme in the design tab.
     */
    @Preview
    @Composable
    fun WoofDarkThemePreview() {
        WoofTheme(darkTheme = true) {
            WoofApp()
        }
    }
    

    当我尝试在模拟器上运行应用程序时,我会收到以下错误:

    Unresolved reference: background
    

    他们没有指定我需要包括的任何进口,所以我缺少什么?

    1 回复  |  直到 2 年前
        1
  •  0
  •   tyg    2 年前

    你可以使用 background 而是使用此导入:

    import androidx.compose.foundation.background
    
        2
  •  0
  •   king meng    2 年前
    import androidx.compose.foundation.background