3
respostas

Erro ao executar app

Olá, estou com esse erro quando vou executar o app

e: C:\Users\mfc20\Navigation1\app\src\main\java\br\com\alura\aluraesporte\ui\activity\ProdutosActivity.kt: (28, 5): 'onAttachFragment' overrides nothing
3 respostas

Código:

package br.com.alura.aluraesporte.ui.activity

import android.os.Bundle
import android.widget.Toast
import androidx.annotation.NonNull
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import br.com.alura.aluraesporte.R
import br.com.alura.aluraesporte.ui.fragment.DetalhesProdutoFragment
import br.com.alura.aluraesporte.ui.fragment.ListaProdutosFragment
import br.com.alura.aluraesporte.ui.fragment.PagamentoFragment
import org.koin.android.ext.android.inject

private const val COMPRA_REALIZADA = "Compra realizada"

class ProdutosActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.produtos_activity)
        if (savedInstanceState == null) {
            val produtosFragment: ListaProdutosFragment by inject()
            transacaoFragment {
                replace(R.id.container, produtosFragment)
            }
        }
    }

    override fun onAttachFragment(fragment: Fragment?) {
        super.onAttachFragment(fragment)
        when (fragment) {
            is ListaProdutosFragment -> {
                fragment.quandoProdutoSelecionado = { produtoSelecionado ->
                    val detalhesProdutoFragment: DetalhesProdutoFragment by inject()
                    val argumentos = Bundle()
                    argumentos.putLong(CHAVE_PRODUTO_ID, produtoSelecionado.id)
                    detalhesProdutoFragment.arguments = argumentos
                    transacaoFragment {
                        addToBackStack(null)
                        replace(R.id.container, detalhesProdutoFragment)
                    }
                }
            }
            is DetalhesProdutoFragment -> {
                fragment.quandoProdutoComprado = { produtoComprado ->
                    val pagamentoFragment: PagamentoFragment by inject()
                    val dado = Bundle()
                    dado.putLong(CHAVE_PRODUTO_ID, produtoComprado.id)
                    pagamentoFragment.arguments = dado
                    transacaoFragment {
                        addToBackStack(null)
                        replace(R.id.container, pagamentoFragment)
                    }
                }
            }
            is PagamentoFragment -> {
                fragment.quandoPagamentoRealizado = {
                    Toast.makeText(this, COMPRA_REALIZADA, Toast.LENGTH_LONG).show()
                }
            }
        }
    }

}

No trecho:

override fun onAttachFragment(fragment: Fragment?) {
    super.onAttachFragment(fragment)
    when (fragment) {
        is ListaProdutosFragment -> {
            fragment.quandoProdutoSelecionado = { produtoSelecionado ->
                val detalhesProdutoFragment: DetalhesProdutoFragment by inject()
                val argumentos = Bundle()
                argumentos.putLong(CHAVE_PRODUTO_ID, produtoSelecionado.id)
                detalhesProdutoFragment.arguments = argumentos
                transacaoFragment {
                    addToBackStack(null)
                    replace(R.id.container, detalhesProdutoFragment)
                }
            }
        }

Eu retirei o " ? " ficando assim:

 override fun onAttachFragment(fragment: Fragment) {
        super.onAttachFragment(fragment)
        when (fragment) {
            is ListaProdutosFragment -> {
                fragment.quandoProdutoSelecionado = { produtoSelecionado ->
                    val detalhesProdutoFragment: DetalhesProdutoFragment by inject()
                    val argumentos = Bundle()
                    argumentos.putLong(CHAVE_PRODUTO_ID, produtoSelecionado.id)
                    detalhesProdutoFragment.arguments = argumentos
                    transacaoFragment {
                        addToBackStack(null)
                        replace(R.id.container, detalhesProdutoFragment)
                    }
                }
            }

procurei soluções na internet e achei essa, o codigo compilou e funcionou até o momento. Não se se acarretará em problemas futuros a retirada do " ? "

Na realidade remover o ? significa que você está falando que sempre receberá um fragment válido, se receber um null por exemplo, seu app vai quebrar dando uma null pointer exception