Search code examples
flutterdartflutter-navigation

I am trying to pass multiple arguments to a flutter screen by using generateRoute


I am trying to do the above in the way shown in How to pass multiple arguments in named route in flutter.

I basically want to pass 2 parameters: docid and isCaregiver to the homescreen but it shows the error that the parameter is not defined for the class. The class ScreenArguments is the class to pass 2 parameters. Please see the code.

ScreenArguments.dart

class ScreenArguments {
  final String docid;
  final bool isCaretaker;

  ScreenArguments({this.docid, this.isCaretaker});
}

main.dart

import 'dart:ui';
import 'package:vitality/stream.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:vitality/screens/login.dart';
import 'screens/homescreen.dart';
import 'screens/chatbot.dart';
import 'screens/todo.dart';
import 'package:vitality/screens/welcome.dart';
import 'screens/register.dart';
import 'package:firebase_core/firebase_core.dart';
import 'components/ScreenArguments.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class ScreenArguments {
  final String reportTitle;
  final String reportFullPath;

  ScreenArguments(this.reportTitle, this.reportFullPath);
}

class Router {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    final args = settings.arguments;
    switch (settings.name) {
      case Welcome.id:
        return MaterialPageRoute(builder: (_) => Welcome());
      case HomeScreen.id:
        return MaterialPageRoute(builder: (BuildContext context) {
          ScreenArguments argument = args;
          return HomeScreen(
            docid: argument.docid,
            isCaretaker: argument.isCaretaker,
          );
        });
      case LoginScreen.id:
        return MaterialPageRoute(builder: (_) => LoginScreen());
      case Register.id:
        return MaterialPageRoute(builder: (_) => Register());
      case ChatBot.id:
        return MaterialPageRoute(builder: (_) => ChatBot());
      case Todo.id:
        return MaterialPageRoute(builder: (_) => Todo());
    }
  }
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData(
        primaryColor: Color(0xff222831),
        accentColor: Color(0xff00adb5),
        textTheme: TextTheme(
          headline1: TextStyle(
              fontSize: 15.0, fontFamily: 'Montserrat', color: Colors.black),
          headline2: TextStyle(
              fontSize: 60.0, fontFamily: 'CrimsonText', color: Colors.black),
          headline3: TextStyle(
              fontSize: 30.0, fontFamily: 'Lora', color: Colors.white),
          headline4: TextStyle(
              fontSize: 30.0, fontFamily: 'Montserrat', color: Colors.white),
        ),
      ),
      initialRoute: Welcome.id,
      routes: {
        'test': (context) => Test(),
        Welcome.id: (context) => Welcome(),
        HomeScreen.id: (context) => HomeScreen(),
        LoginScreen.id: (context) => LoginScreen(),
        Register.id: (context) => Register(),
        ChatBot.id: (context) => ChatBot(),
        Todo.id: (context) => Todo()
      },
    );
  }
}

login.dart

Button(
                        text: 'LOGIN AS INFIRM ',
                        onPressed: () {
                          doesElderlyExist();
                          print('docid after elderly function call: $docid');
                          if (docid == null) {
                            print('user does not exist');
                          } else {
                            isCaretaker = false;
                            Navigator.pushNamed(context, HomeScreen.id,
                                arguments: ScreenArguments(docid, isCaretaker));
                          }
                        }),

Error shown in main.dart errors shown in main.dart

Error shown in login.dart error in login.dart


Solution

  • generateRoute function does not know that your arguments are of type ScreenArguments, you should define that explicitly:

    ...
    case HomeScreen.id:
      return MaterialPageRoute(builder: (BuildContext context) {
        final argument = args as ScreenArguments;
    
        return HomeScreen(
          docid: argument.docid,
          isCaretaker: argument.isCaretaker,
        );
      });
    ...
    

    One more thing there is that you have another class defined in main.dart with the same name ScreenArguments, double-check that and remove the unused one (based on your example, the one with reportTitle and reportFullPath properties is the "wrong" one).