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));
}
}),
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).