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.

Flutter NamedRoutes desde LoginScreen a HomeScreen utilizando widget personalizado no funciona.

Estoy tratando de ir de una pantalla a otra.

En mi pantalla de inicio de sesión tengo dos botones a los que quiero ir a la siguiente pantalla cuando se pulsan. Un botón “LOGIN” y un botón “REGISTER BUTTON”.

Cuando uso Navigator.pushName desde dentro de un TextButton “LOGIN”, todo funciona bien y puedo ir a homescreen.id. Sin embargo, cuando uso mi propio widget personalizado llamado RoundedButton, no funciona (que extraje del TextButton).

Aquí está el código de mi Roundedbutton()

Aquí está mi archivo main.dart para referencia.

import 'package:flutter/material.dart';
import 'screens/login_screen.dart';
import 'screens/registration_screen.dart';
import 'screens/home_screen.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  static const String _title = 'test app';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: _title,
      theme: ThemeData(
        primarySwatch: Colors.purple,
      ),
      initialRoute: LoginScreen.id,
      routes: {
        LoginScreen.id : (context) => const LoginScreen(),
        RegistrationScreen.id : (context) => const RegistrationScreen(),
        Homescreen.id : (context) => const Homescreen(),
      },
    );
  }
}

También estoy usando una variable String estática en todas mis pantallas que es cómo llamo a Navigator.pushNamed(context, Homescreen.id);
“`
class Homescreen extends StatefulWidget {
const Homescreen({Key? key}) : super(key: key);

static String id = ‘home_screen’;
}

[Estoy usando Flutter versión: 2.8.1 y Dart versión 2.15.1]

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para navegar a una nueva pantalla en Flutter, puedes utilizar el método Navigator.pushNamed(). En este caso, tienes dos botones en tu pantalla de inicio de sesión – “INICIAR SESIÓN” y “REGISTRARSE”. Quieres navegar a una nueva pantalla cuando se pulse cualquiera de estos botones.

    Cuando utilizas Navigator.pushNamed() dentro del TextButton “INICIAR SESIÓN”, todo funciona bien, pero cuando lo utilizas dentro de un widget personalizado llamado RoundedButton, no funciona.

    Para solucionar esto, puedes pasar el parámetro context al widget RoundedButton y luego utilizarlo para navegar a una nueva pantalla. Así es como puedes modificar el widget RoundedButton:

    class RoundedButton extends StatelessWidget {
      final String text;
      final Function()? onPressed;
      final Color color, textColor;
    
      const RoundedButton({
        Key? key,
        required this.text,
        required this.onPressed,
        this.color = Colors.white,
        this.textColor = Colors.black,
      }) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return ElevatedButton(
          onPressed: onPressed,
          style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all<color>(color),
          ),
          child: Text(
            text,
            style: TextStyle(color: textColor),
          ),
        );
      }
    }
    

    Luego, puedes pasar el parámetro context al widget RoundedButton:

    RoundedButton(
      text: 'INICIAR SESIÓN',
      onPressed: () {
        Navigator.pushNamed(context, Homescreen.id);
      },
    ),
    

    Esto debería permitirte navegar a una nueva pantalla utilizando el widget RoundedButton.

Comments are closed.