es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error: Valor constante no válido al establecer una clave global para scaffoldMessengerKey.

Quería usar Snackbar sin Scaffold. Encontré muchas preguntas similares que hacían lo mismo, pero por alguna razón no me funciona.

    Future<void> main() async {
      await dotenv.load(fileName: '.env');
      runApp(const HomeScreens());
    }
    
class HomeScreens extends StatefulWidget {
  const HomeScreens({Key? key}) : super(key: key);

  @override
  _HomeScreensState createState() => _HomeScreensState();
}

class _HomeScreensState extends State<HomeScreens> {
  late final GlobalKey<ScaffoldMessengerState>? scaffoldMessengerKey;
  
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
     create:(BuildContext context) => MyCurrentTrack(),
      child: const MaterialApp(
        scaffoldMessengerKey: scaffoldMessengerKey, // <= this
        home: LoginScreen(),
        debugShowCheckedModeBanner: false,
      ),
    );
  }
}

y también intenté esto, pero siempre obtengo el mismo error:

class _HomeScreensState extends State<HomeScreens> {
  final GlobalKey<ScaffoldMessengerState> rootScaffoldMessengerKey = GlobalKey<ScaffoldMessengerState>();

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
     create:(BuildContext context) => MyCurrentTrack(),
      child: const MaterialApp(
        scaffoldMessengerKey: rootScaffoldMessengerKey, // <= this
        home: LoginScreen(),
        debugShowCheckedModeBanner: false,
      ),
    );
  }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás tratando de usar un SnackBar sin usar un Scaffold. Sin embargo, ambos enfoques que has intentado involucran establecer la propiedad scaffoldMessengerKey de un MaterialApp como una GlobalKey<scaffoldmessengerstate>. Esto implica que aún estás usando un Scaffold en algún lugar de tu aplicación.

    Si deseas usar un SnackBar sin un Scaffold, puedes utilizar un widget Builder para proporcionar un BuildContext que tenga acceso a un objeto Scaffold. Aquí tienes un ejemplo:

    class MyWidget extends StatelessWidget {
      const MyWidget({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Container(
          child: ElevatedButton(
            onPressed: () {
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: Text('¡Hola, mundo!'),
                ),
              );
            },
            child: Text('Mostrar Snackbar'),
          ),
        );
      }
    }
    

    En este ejemplo, utilizamos el método ScaffoldMessenger.of(context) para obtener un objeto ScaffoldMessengerState del BuildContext proporcionado. Luego podemos llamar al método showSnackBar en este objeto para mostrar un SnackBar. El BuildContext debe ser proporcionado por un widget que sea un ancestro de MyWidget y que utilice un Scaffold.

    Espero que esto te ayude. Hazme saber si tienes alguna pregunta adicional.

Comments are closed.