Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] OutlinedTextField com warning "This material API is experimental and is likely to change or to be removed in the future."

Bom dia a todos

Eu tentei inserir o OutlinedTextField igual ao da aula e apareceu essa mensagem para mim:

This material API is experimental and is likely to change or to be removed in the future.

Eu estou usando a versão material 3 do compose:

implementation 'androidx.compose.material3:material3'

E para dar certo no meu código tive que colocar a anotação @OptIn(ExperimentalMaterial3Api::class), ficando assim:

//deixei só os imports relacionados à questão
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.ui.text.input.TextFieldValue

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MenuPedidosScreen(sessoes: Map<String,List<Produto>>) {
    Column {
              var text by remember{
            mutableStateOf("")
        }
        OutlinedTextField(value = text, onValueChange = { novoValor ->
            text = novoValor
        }, label = { Text(text = "Busca")})
//omiti o resto do código

Eu queria saber porque isso aconteceu. Se essa essa função é experimental, qual é a oficial do material 3? Ou pode ser alguma configuração que eu fiz?

Ps: eu olhei na documentação do material 3 com jetpack e não encontrei nada diferente do que eu fiz para ter sido necessário eu colocar essa anotação

Atualização: percebi que nesta versão existem 2 tipos de OutlinedTextField, um que recebe String em value e outro que recebe TextFieldValue. E não sei como definir quando tem que ser um deles

public fun OutlinedTextField(value: TextFieldValue, onValueChange: (TextFieldValue) → Unit, modifier: Modifier = ..., enabled: Boolean = ..., readOnly: Boolean = ..., textStyle: TextStyle = ..., label: (() → Unit)? = ..., placeholder: (() → Unit)? = ..., leadingIcon: (() → Unit)? = ..., trailingIcon: (() → Unit)? = ..., supportingText: (() → Unit)? = ..., isError: Boolean = ..., visualTransformation: VisualTransformation = ..., keyboardOptions: KeyboardOptions = ..., keyboardActions: KeyboardActions = ..., singleLine: Boolean = ..., maxLines: Int = ..., interactionSource: MutableInteractionSource = ..., shape: Shape = ..., colors: TextFieldColors = ...): Unit defined in androidx.compose.material3
public fun OutlinedTextField(value: String, onValueChange: (String) → Unit, modifier: Modifier = ..., enabled: Boolean = ..., readOnly: Boolean = ..., textStyle: TextStyle = ..., label: (() → Unit)? = ..., placeholder: (() → Unit)? = ..., leadingIcon: (() → Unit)? = ..., trailingIcon: (() → Unit)? = ..., supportingText: (() → Unit)? = ..., isError: Boolean = ..., visualTransformation: VisualTransformation = ..., keyboardOptions: KeyboardOptions = ..., keyboardActions: KeyboardActions = ..., singleLine: Boolean = ..., maxLines: Int = ..., interactionSource: MutableInteractionSource = ..., shape: Shape = ..., colors: TextFieldColors = ...): Unit defined in androidx.compose.material3
1 resposta
solução!

Olá, Murilo! Bom dia!

Entendo sua dúvida em relação ao aviso "This material API is experimental and is likely to change or to be removed in the future" ao utilizar o OutlinedTextField no Jetpack Compose com a versão material 3.

Esse aviso indica que a API do OutlinedTextField ainda está em fase experimental e pode sofrer alterações ou até mesmo ser removida em futuras versões. Por isso, é necessário utilizar a anotação @OptIn(ExperimentalMaterial3Api::class) para indicar que você está ciente dessa experimentalidade e que está utilizando a API mesmo assim.

Em relação aos dois tipos de OutlinedTextField, um que recebe String em value e outro que recebe TextFieldValue, a diferença está na forma como você manipula o valor do campo de texto.

Se você utilizar o OutlinedTextField que recebe String, o valor do campo será uma String simples. Por exemplo:

OutlinedTextField(value = text, onValueChange = { novoValor ->
    text = novoValor
}, label = { Text(text = "Busca")})

Já se você utilizar o OutlinedTextField que recebe TextFieldValue, o valor do campo será um objeto TextFieldValue, que possui propriedades para manipular o texto, como text e selection. Por exemplo:

var textFieldValue by remember { mutableStateOf(TextFieldValue()) }

OutlinedTextField(value = textFieldValue, onValueChange = { novoValor ->
    textFieldValue = novoValor
}, label = { Text(text = "Busca")})

Dessa forma, você pode escolher qual tipo de OutlinedTextField utilizar de acordo com suas necessidades.

Espero ter ajudado e bons estudos!