2
respostas

[Dúvida] O meu SnackBar não esta dando certo

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

fica dando este erro

Meu Codigo: import 'package:flutter/material.dart';

class FormScreen extends StatefulWidget { const FormScreen({Key? key}) : super(key: key);

@override State createState() => _FormScreenState(); }

class _FormScreenState extends State { TextEditingController usernameController = TextEditingController(); TextEditingController passwordController = TextEditingController(); final _formKey = GlobalKey();

@override Widget build(BuildContext context) { return MaterialApp( home: Scaffold( appBar: AppBar( title: Text('Login'), ), body: Form( key: _formKey, child: Center( child: SingleChildScrollView( child: Container( height: 650, width: 375, decoration: BoxDecoration( color: Colors.black12, border: Border.all(color: Colors.black, width: 2), borderRadius: BorderRadius.circular(8), ), child: Column( children: [ Padding( padding: const EdgeInsets.all(8.0), child: TextFormField(

                      textAlign: TextAlign.center,
                      controller: usernameController,
                      validator: (value) {
                        if (value!.isEmpty && value != 'Victor') {
                          return 'Username Errado';
                        }
                        return null;
                      },
                      decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          hintText: 'Username',
                          fillColor: Colors.white70,
                          filled: true
                      ),
                    ),
                  ),
                  Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: TextFormField(
                      textAlign: TextAlign.center,
                      controller: passwordController,
                      validator: (value) {
                        if (value!.isEmpty && value != '123') {
                          return 'Username Errado';
                        }
                        return null;
                      },
                      decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          hintText: 'Passoword',
                          fillColor: Colors.white70,
                          filled: true),
                    ),
                  ),
                  ElevatedButton(
                      onPressed: () {
                        if (_formKey.currentState!.validate()) {
                          ScaffoldMessenger.of(context).showSnackBar(
                            const SnackBar(content: Text('Teste'))
                          );
                        }
                      },
                      child: Text('Adicionar'))
                ],
              ),
            ),
          ),
        ),
      )),
);

} }

2 respostas

Olá, Victor! Tudo bem?

Pelo que entendi, você está enfrentando um problema ao utilizar o SnackBar no seu código. O erro que está aparecendo indica que não há um Scaffold disponível para apresentar o SnackBar.

Isso acontece porque você está utilizando o ScaffoldMessenger.of(context) para mostrar o SnackBar, mas o ScaffoldMessenger precisa de um Scaffold como ancestral para funcionar corretamente.

Uma solução para esse problema é envolver o seu MaterialApp com um Scaffold. Assim, o ScaffoldMessenger terá um Scaffold para trabalhar.

Aqui está um exemplo de como você pode fazer isso:

class FormScreen extends StatefulWidget {
  const FormScreen({Key? key}) : super(key: key);

  @override
  State<FormScreen> createState() => _FormScreenState();
}

class _FormScreenState extends State<FormScreen> {
  // Restante do seu código...

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Login'),
        ),
        body: Scaffold(
          body: Form(
            key: _formKey,
            child: Center(
              // Restante do seu código...
            ),
          ),
        ),
      ),
    );
  }
}

Dessa forma, você terá um Scaffold como ancestral do ScaffoldMessenger, permitindo que o SnackBar seja exibido corretamente.

Espero ter ajudado e bons estudos!

então no body eu coloco outro scarfold?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software