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

[Dúvida] Não consigo adicionar o SnackBar

O erro que aparece é esse:

Exception has occurred.****

_AssertionError ('package:flutter/src/material/scaffold.dart': Failed assertion: line 314 pos 7: '_scaffolds.isNotEmpty': ScaffoldMessenger.showSnackBar was called, but there are currently no descendant Scaffolds to present to.)

Pelo que a mensagem diz, minha SnackBar tem que descender de um Scaffold, porém como eu faço isso?

Tentei fazer dessa forma https://dev.to/dailydevtips1/adding-a-snackbar-in-flutter-57ma e não deu certo, eu gostaria de saber qual é a forma correta de chamar um SnackBar.

Também gostaria de saber o que é context e mais sobre BuildContext, eu sinto que estou deixando algo passar. A única solução é tentar criar uma SnackBar Global como nesse vídeo: https://www.youtube.com/watch?v=2NJ8PLCvCNE. Eu gosto muito da abordagem da Alura pra explicar alguns conteúdos, porém também sinto falta de conteúdo teórico...

A seguir está meu bloco de código:

 ///ElevatedButton
                  Padding(
                    padding: const EdgeInsets.only(top: 15),
                    child: ElevatedButton(
                      onPressed: () {
                      
                      //O erro aparece nesse setor 
                        if (_formKey.currentState!.validate()) {}
                        final snackBar = SnackBar(
                          content: Text('Tarefa criada '),
                        );
                        ScaffoldMessenger.of(context).showSnackBar(snackBar);
                      },
                      
                      style: ElevatedButton.styleFrom(
                        backgroundColor: Colors.blue,
                        foregroundColor: Colors.white,
                        textStyle: const TextStyle(fontWeight: FontWeight.bold),
                        shape: const ContinuousRectangleBorder(
                          borderRadius: BorderRadius.all(
                            Radius.circular(10),
                          ),
                        ),
                      ),
                      child: const Text('Adicionar'),
                    ), //ElevatedButton
                  ) Padding
1 resposta
solução!

Finalmente encontrei uma solução para o problema! Uma das maiores dificuldades que enfrentei foi compreender a exceção que estava ocorrendo. Após pesquisar em diversos fóruns e experimentar diferentes abordagens, consegui identificar a causa e implementar a solução.

O código abaixo apresenta uma versão simplificada do código base do Flutter, onde apliquei uma Snackbar para ilustrar o comportamento. É importante ressaltar que a formatação visual não foi priorizada neste exemplo, meu objetivo principal era entender o funcionamento da Snackbar.

Gostaria de agradecer aos profissionais que dedicam seu tempo para compartilhar conhecimento gratuitamente na internet. Sua contribuição é fundamental para a comunidade de desenvolvedores.

import 'package:flutter/material.dart';

// Defina uma chave global para o ScaffoldMessenger
final GlobalKey<ScaffoldMessengerState> scaffoldMessengerKey =
    GlobalKey<ScaffoldMessengerState>();

class GlobalSnackBar extends StatefulWidget {
  @override
  State<GlobalSnackBar> createState() => _GlobalSnackBarState();
}

class _GlobalSnackBarState extends State<GlobalSnackBar> {

  int _incrementCounter = 0;
  
  void showGlobalSnackBar(String message) {
    scaffoldMessengerKey.currentState?.showSnackBar(
      SnackBar(
        content: Text(message),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return ScaffoldMessenger(
      key: scaffoldMessengerKey,
      child: Scaffold(
        appBar: AppBar(
          title: const Text('Título'),
          backgroundColor: Colors.blue,
        ),
        body: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            const Text(" Aperte o botão  "),
            Text("$_incrementCounter", style: const TextStyle(fontSize: 24),),
          ],
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: () {
            setState(
              () {
                _incrementCounter++;
              },
            );
            showGlobalSnackBar("Você apertou o botão");
          },
        ),
      ),
    );
  }
}