Issue
I have a stateful widget that returns a scaffold as follows:
class TimerPage extends StatefulWidget {
const TimerPage({Key? key, required this.title}) : super(key: key);
final String title;
@override
TimerPageState createState() => TimerPageState();
}
class TimerPageState extends State<TimerPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
// Here we take the value from the MyHomePage object that was created by
// the App.build method, and use it to set our appbar title.
title: Text(widget.title),
),
body: Center(
mainAxisAlignment: MainAxisAlignment.center,
children: [
getMaterialTextButton('1', 'Roboto', 24, keypadPressed('1')), /// ERROR
getMaterialTextButton('2', 'Roboto', 24, keypadPressed2('2')), /// ERROR
]
),
);
}
}
So what I'm trying to do is pass a generic function inside getMaterialTextButton() that will return a material button as follows:
// this function is within the TimerPageState class
Widget getMaterialTextButton(String text, String fontname, double fontsize, Function onPressAction) {
return (
MaterialButton(
onPressed: () {
onPressAction(text);
},
color: Colors.blue,
textColor: Colors.white,
child: Text(
text,
style: TextStyle(fontFamily: fontname, fontSize: fontsize)
),
padding: const EdgeInsets.all(24),
shape: const CircleBorder(),
)
);
}
// this function is to be called when the button 1 is pressed
// also resides inside TimerPageState class
void keyPressed (String text) {
print('Pressed: $text');
}
// this function is also to be called when button 2 is pressed
// also resides inside TimerPageState class
void keyPressed2 (String text) {
print('Pressed: $text');
}
But this doesn't seem to work as dart is giving me an exception:
Exception has occurred. _TypeError (type 'Null' is not a subtype of type 'Function')
. How can I do this operation properly?
Solution
Firstly you should prefer a full signature in your function type annotations https://dart.dev/guides/language/effective-dart/design#prefer-signatures-in-function-type-annotations
so
Widget getMaterialTextButton(String text, String fontname, double fontsize, Function onPressAction) {...}
should be
Widget getMaterialTextButton(String text, String fontname, double fontsize, void Function(String) onPressAction) {...}
Secondly, this is not passing in a function:
getMaterialTextButton('1', 'Roboto', 24, keypadPressed('1')),
That is calling the keypadPressed and passing in the result of the function, which appears to be void. Remove the parenthesis, and do not pass anything into keypadPressed, the body of getMaterialTextButton is where the function should be called.
getMaterialTextButton('1', 'Roboto', 24, keypadPressed),
Answered By - mmcdon20
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.