8. Programando Login com Firebase

8.1. Classe HomeFragment

O fragmento da tela inicial é a primeira janela exibida no aplicativo. Nesta versão inicial, ele apresenta apenas informações básicas do usuário. Abaixo, segue o código completo:

package ...

import ...

class HomeFragment : Fragment() {
private lateinit var mAuth: FirebaseAuth //acessa os recursos de autenticação do Firebase
private lateinit var loginTextView: TextView

companion object {
fun newInstance() = HomeFragment()
}

private val viewModel: HomeViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

// TODO: Use the ViewModel
}

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
//salva em uma variável o layout gerado do arquivo xml
val view = inflater.inflate(R.layout.fragment_home, container, false)
//acessa o componente loginTextView da tela carregada
loginTextView = view.findViewById(R.id.loginTextView)
//acessa o componente logOutButton da tela carregada
val logOutButton = view.findViewById<Button>(R.id.logOutButton)
//adiciona a ação de logout no clique do mouse
logOutButton.setOnClickListener{
mAuth.signOut()
}
return view
}

override fun onStart() {
super.onStart()
//inicializa o serviço de autenticação do Firebase
mAuth = Firebase.auth
//obtem os dados do usuário atual
val currentUser = mAuth.currentUser
//verifica se o usuário existe
if (currentUser != null) {
Log.d("TODO2024", "Usuário logado: " + currentUser.email)
loginTextView.text = "Usuário:" + currentUser.email
//getTarefas()
}
//caso contrário encaminha para a página de login
else {
Log.d("TODO2024", "Usuário deslogado")
findNavController(requireView()).navigate(R.id.action_homeFragment_to_loginFragment)
}
}
}

A variável mAuth utiliza a palavra-chave lateinit, que permite declarar o objeto sem inicializá-lo imediatamente, informando ao Kotlin que ele será instanciado no futuro. Faremos essa inicialização no método onStart. A outra variável, loginTextView, será usada como referência ao componente de texto na interface da tela inicial, exibindo informações básicas do usuário para testes e depuração.

Ciclo de Vida de Fragmentos

Assim como atividades, fragmentos possuem um ciclo de vida próprio, mas com algumas diferenças. Eles são gerenciados e destruídos pelo sistema Android conforme necessário, o que significa que nem sempre usamos o método onCreate para configurações iniciais. Em vez disso, usamos onCreateView para definir a interface gráfica e realizar as configurações necessárias para o fragmento.

Método onCreateView

O método onCreateView é responsável por inflar (carregar) o arquivo XML da interface gráfica e retornar essa visualização para o sistema. No entanto, como precisamos acessar elementos específicos da UI, criamos uma variável view para armazenar a interface carregada, permitindo que possamos referenciar componentes específicos, como o botão logOutButton e a textview loginTextView. Com o objeto logOutButton em mãos, configuramos um listener de clique que chama o método signOut() do objeto mAuth, deslogando o usuário do sistema. O objeto mAuth fornece acesso a todos os métodos necessários para a autenticação no Firebase, permitindo ações como login, logout, recuperação de senha e outros.

Método onStart

É recomendado realizar configurações de persistência e inicializar objetos de autenticação no método onStart, que é chamado toda vez que o fragmento é exibido novamente após uma pausa. Assim, neste método inicializamos o objeto de autenticação mAuth para garantir acesso aos serviços do Firebase. Em seguida, verificamos se existe um usuário logado. Caso contrário, redirecionamos o usuário para a tela de login.

Navegação entre Telas

Para realizar a navegação entre telas, utilizamos um objeto NavController. O NavController permite a transição de fragmentos conforme as ações configuradas no gráfico de navegação do projeto. Para abrir a tela de login, por exemplo, basta chamar o NavController com a ação configurada no XML de navegação. Esse processo é simples e requer apenas uma linha de código, tornando a navegação entre fragmentos prática e eficiente. Para usar a navegação no Android com Kotlin, é importante configurar o gráfico de navegação no XML e associar as ações no NavController ao evento desejado, como o clique de um botão.

Exibindo Dados do Usuário

Caso exista um usuário logado, extraímos as informações desse usuário e exibimos no componente loginTextView da tela inicial. Isso permite verificar e testar dados básicos, garantindo que o sistema de login e o armazenamento de informações estão funcionando conforme esperado.